最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中SynchronizedList和Vector的區(qū)別詳解

 更新時間:2019年06月25日 15:34:46   作者:hollischuang  
這篇文章主要介紹了java中SynchronizedList和Vector的區(qū)別詳解,Vector是java.util包中的一個類。 SynchronizedList是java.util.Collections中的一個靜態(tài)內(nèi)部類。,需要的朋友可以參考下

前言

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

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

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

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

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

一、比較幾個重要的方法

1.1 add方法

Vector的實現(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 code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}

synchronizedList的實現(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使用同步方法實現(xiàn),synchronizedList使用同步代碼塊實現(xiàn)。
  2. 兩者的擴充數(shù)組容量方式不一樣(兩者的add方法在擴容方面的差別也就是ArrayList和Vector的差別。)

1.2 remove方法

synchronizedList的實現(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 work
return oldValue;
}

Vector的實現(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 work
return oldValue;
}

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

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

二、區(qū)別分析

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

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

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

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

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

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

  1. 如果使用add方法,那么他們的擴容機制不一樣。
  2. SynchronizedList可以指定鎖定的對象。

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

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

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyBatis的動態(tài)SQL語句實現(xiàn)

    MyBatis的動態(tài)SQL語句實現(xiàn)

    這篇文章主要介紹了MyBatis的動態(tài)SQL語句實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Spring,hibernate,struts經(jīng)典面試筆試題(含答案)

    Spring,hibernate,struts經(jīng)典面試筆試題(含答案)

    這篇文章主要介紹了Spring,hibernate,struts經(jīng)典面試筆試題極其參考含答案,涉及SSH基本概念,原理與使用技巧,需要的朋友可以參考下
    2016-03-03
  • 詳解Java設(shè)計模式之橋接模式

    詳解Java設(shè)計模式之橋接模式

    橋接,顧名思義,就是用來連接兩個部分,使得兩個部分可以互相通訊。橋接模式將系統(tǒng)的抽象部分與實現(xiàn)部分分離解耦,使他們可以獨立的變化。本文通過示例詳細介紹了橋接模式的原理與使用,需要的可以參考一下
    2022-10-10
  • 詳解static 和 final 和 static final區(qū)別

    詳解static 和 final 和 static final區(qū)別

    這篇文章主要介紹了static 和 final 和 static final區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • spring循環(huán)依賴策略解析

    spring循環(huán)依賴策略解析

    這篇文章主要為大家詳細介紹了spring循環(huán)依賴策略,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • java.lang.UnsupportedClassVersionError錯誤的解決辦法(附圖文)

    java.lang.UnsupportedClassVersionError錯誤的解決辦法(附圖文)

    這篇文章主要給大家介紹了關(guān)于java.lang.UnsupportedClassVersionError錯誤的解決辦法,"java.lang.UnsupportedClassVersionError"意味著您正在運行的Java版本與編譯該類時使用的Java版本不兼容,需要的朋友可以參考下
    2023-10-10
  • SpringBoot集成pf4j實現(xiàn)插件開發(fā)功能的代碼示例

    SpringBoot集成pf4j實現(xiàn)插件開發(fā)功能的代碼示例

    pf4j是一個插件框架,用于實現(xiàn)插件的動態(tài)加載,支持的插件格式(zip、jar),本文給大家介紹了SpringBoot集成pf4j實現(xiàn)插件開發(fā)功能的示例,文中通過代碼示例給大家講解的非常詳細,需要的朋友可以參考下
    2024-07-07
  • IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報錯解決方法

    IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報錯解決方法

    這篇文章主要介紹了IDEA安裝lombok插件設(shè)置Enable Annotation Processing后編譯依然報錯解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Druid之連接創(chuàng)建及銷毀示例詳解

    Druid之連接創(chuàng)建及銷毀示例詳解

    這篇文章主要為大家介紹了Druid之連接創(chuàng)建及銷毀示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • idea中解決maven包沖突的問題(maven helper)

    idea中解決maven包沖突的問題(maven helper)

    這篇文章主要介紹了idea中解決maven包沖突的問題(maven helper),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12

最新評論

维西| 嘉祥县| 太和县| 徐闻县| 当涂县| 亚东县| 永丰县| 连江县| 佛冈县| 文山县| 封丘县| 紫金县| 自贡市| 栖霞市| 额济纳旗| 聂荣县| 唐海县| 贺兰县| 疏附县| 奇台县| 澜沧| 罗平县| 洪江市| 嘉善县| 大城县| 武山县| 双流县| 紫云| 衡阳县| 繁昌县| 乌苏市| 邢台市| 枞阳县| 安义县| 敦煌市| 三都| 武清区| 铁岭县| 綦江县| 石景山区| 宜丰县|