成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

java中SynchronizedList和Vector的區(qū)別-創(chuàng)新互聯(lián)

本篇內(nèi)容主要講解“java中SynchronizedList和Vector的區(qū)別”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“java中SynchronizedList和Vector的區(qū)別”吧!

在城陽(yáng)等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需求定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),營(yíng)銷型網(wǎng)站,外貿(mào)網(wǎng)站建設(shè),城陽(yáng)網(wǎng)站建設(shè)費(fèi)用合理。

前言

Vector是java.util包中的一個(gè)類。 SynchronizedList是java.util.Collections中的一個(gè)靜態(tài)內(nèi)部類。

在多線程的場(chǎng)景中可以直接使用Vector類,也可以使用Collections.synchronizedList(List list)方法來返回一個(gè)線程安全的List。

那么,到底SynchronizedList和Vector有沒有區(qū)別,為什么java api要提供這兩種線程安全的List的實(shí)現(xiàn)方式呢?

首先,我們知道Vector和Arraylist都是List的子類,他們底層的實(shí)現(xiàn)都是一樣的。所以這里比較如下兩個(gè)list1和list2的區(qū)別:

List<String> list = new ArrayList<String>();List list2 = Collections.synchronizedList(list);Vector<String> list1 = new Vector<String>();

一、比較幾個(gè)重要的方法

1.1 add方法

Vector的實(shí)現(xiàn):

public void add(int index, E element) {insertElementAt(element, index);}public synchronized void insertElementAt(E obj, int index) {modCount++;if (index > elementCount) {throw new ArrayIndexOutOfBoundsException(index+ " > " + elementCount);}ensureCapacityHelper(elementCount + 1);System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);elementData[index] = obj;elementCount++;}private void ensureCapacityHelper(int minCapacity) {// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}

synchronizedList的實(shí)現(xiàn):

public void add(int index, E element) {synchronized (mutex) {list.add(index, element);}}

這里,使用同步代碼塊的方式調(diào)用ArrayList的add()方法。ArrayList的add方法內(nèi)容如下:

public void add(int index, E element) {rangeCheckForAdd(index);ensureCapacityInternal(size + 1); // Increments modCount!!System.arraycopy(elementData, index, elementData, index + 1,size - index);elementData[index] = element;size++;}private void rangeCheckForAdd(int index) {if (index > size || index < 0)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}private void ensureCapacityInternal(int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity);}

從上面兩段代碼中發(fā)現(xiàn)有兩處不同:

  1. Vector使用同步方法實(shí)現(xiàn),synchronizedList使用同步代碼塊實(shí)現(xiàn)。  兩者的擴(kuò)充數(shù)組容量方式不一樣(兩者的add方法在擴(kuò)容方面的差別也就是ArrayList和Vector的差別。)

1.2 remove方法

synchronizedList的實(shí)現(xiàn):

public E remove(int index) {synchronized (mutex) {return list.remove(index);}}

ArrayList類的remove方法內(nèi)容如下:

public E remove(int index) {rangeCheck(index);modCount++;E oldValue = elementData(index);int numMoved = size - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its workreturn oldValue;}

Vector的實(shí)現(xiàn):

public synchronized E remove(int index) {modCount++;if (index >= elementCount)throw new ArrayIndexOutOfBoundsException(index);E oldValue = elementData(index);int numMoved = elementCount - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--elementCount] = null; // Let gc do its workreturn oldValue;}

從remove方法中我們發(fā)現(xiàn)除了一個(gè)使用同步方法,一個(gè)使用同步代碼塊之外幾乎無任何區(qū)別。

通過比較其他方法,我們發(fā)現(xiàn),SynchronizedList里面實(shí)現(xiàn)的方法幾乎都是使用同步代碼塊包上List的方法。如果該List是ArrayList,那么,SynchronizedList和Vector的一個(gè)比較明顯區(qū)別就是一個(gè)使用了同步代碼塊,一個(gè)使用了同步方法。

二、區(qū)別分析

數(shù)據(jù)增長(zhǎng)區(qū)別

從內(nèi)部實(shí)現(xiàn)機(jī)制來講ArrayList和Vector都是使用數(shù)組(Array)來控制集合中的對(duì)象。當(dāng)你向這兩種類型中增加元素的時(shí)候,如果元素的數(shù)目超出了內(nèi)部數(shù)組目前的長(zhǎng)度它們都需要擴(kuò)展內(nèi)部數(shù)組的長(zhǎng)度,Vector缺省情況下自動(dòng)增長(zhǎng)原來一倍的數(shù)組長(zhǎng)度,ArrayList是原來的50%,所以最后你獲得的這個(gè)集合所占的空間總是比你實(shí)際需要的要大。所以如果你要在集合中保存大量的數(shù)據(jù)那么使用Vector有一些優(yōu)勢(shì),因?yàn)槟憧梢酝ㄟ^設(shè)置集合的初始化大小來避免不必要的資源開銷。

同步代碼塊和同步方法的區(qū)別

  1. 同步代碼塊在鎖定的范圍上可能比同步方法要小,一般來說鎖的范圍大小和性能是成反比的。  同步塊可以更加精確的控制鎖的作用域(鎖的作用域就是從鎖被獲取到其被釋放的時(shí)間),同步方法的鎖的作用域就是整個(gè)方法。  靜態(tài)代碼塊可以選擇對(duì)哪個(gè)對(duì)象加鎖,但是靜態(tài)方法只能給this對(duì)象加鎖。

因?yàn)镾ynchronizedList只是使用同步代碼塊包裹了ArrayList的方法,而ArrayList和Vector中同名方法的方法體內(nèi)容并無太大差異,所以在鎖定范圍和鎖的作用域上兩者并無卻別。 在鎖定的對(duì)象區(qū)別上,SynchronizedList的同步代碼塊鎖定的是mutex對(duì)象,Vector鎖定的是this對(duì)象。那么mutex對(duì)象又是什么呢? 其實(shí)SynchronizedList有一個(gè)構(gòu)造函數(shù)可以傳入一個(gè)Object,如果在調(diào)用的時(shí)候顯示的傳入一個(gè)對(duì)象,那么鎖定的就是用戶傳入的對(duì)象。如果沒有指定,那么鎖定的也是this對(duì)象。

所以,SynchronizedList和Vector的區(qū)別目前為止有兩點(diǎn):

  1. 如果使用add方法,那么他們的擴(kuò)容機(jī)制不一樣。  SynchronizedList可以指定鎖定的對(duì)象。

但是,凡事都有但是。 SynchronizedList中實(shí)現(xiàn)的類并沒有都使用synchronized同步代碼塊。其中有l(wèi)istIterator和listIterator(int index)并沒有做同步處理。但是Vector卻對(duì)該方法加了方法鎖。 所以說,在使用SynchronizedList進(jìn)行遍歷的時(shí)候要手動(dòng)加鎖。

但是,但是之后還有但是。

之前的比較都是基于我們將ArrayList轉(zhuǎn)成SynchronizedList。那么如果我們想把LinkedList變成線程安全的,或者說我想要方便在中間插入和刪除的同步的鏈表,那么我可以將已有的LinkedList直接轉(zhuǎn)成 SynchronizedList,而不用改變他的底層數(shù)據(jù)結(jié)構(gòu)。而這一點(diǎn)是Vector無法做到的,因?yàn)樗牡讓咏Y(jié)構(gòu)就是使用數(shù)組實(shí)現(xiàn)的,這個(gè)是無法更改的。

所以,最后,SynchronizedList和Vector最主要的區(qū)別:

  1. SynchronizedList有很好的擴(kuò)展和兼容功能。他可以將所有的List的子類轉(zhuǎn)成線程安全的類。  使用SynchronizedList的時(shí)候,進(jìn)行遍歷時(shí)要手動(dòng)進(jìn)行同步處理。  SynchronizedList可以指定鎖定的對(duì)象。

到此,相信大家對(duì)“java中SynchronizedList和Vector的區(qū)別”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)建站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

本文題目:java中SynchronizedList和Vector的區(qū)別-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://jinyejixie.com/article18/dhdjdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化、虛擬主機(jī)營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站收錄、全網(wǎng)營(yíng)銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
富源县| 天等县| 吐鲁番市| 五大连池市| 厦门市| 宁夏| 灵石县| 娱乐| 呼伦贝尔市| 濮阳县| 光泽县| 邹平县| 巴彦县| 岳普湖县| 水富县| 上杭县| 木里| 鲁山县| 伊宁县| 天门市| 饶阳县| 梅州市| 布尔津县| 汉寿县| 曲水县| 泗洪县| 津市市| 澄城县| 二手房| 苗栗县| 绍兴市| 福清市| 潮安县| 西充县| 舟曲县| 金沙县| 堆龙德庆县| 五台县| 巴青县| 会昌县| 穆棱市|