欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

ArrayList源碼和多線程安全問題分析

1.ArrayList源碼和多線程安全問題分析

成都創(chuàng)新互聯(lián)公司專注于達(dá)茂旗企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,成都做商城網(wǎng)站。達(dá)茂旗網(wǎng)站建設(shè)公司,為達(dá)茂旗等地區(qū)提供建站服務(wù)。全流程定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

在分析ArrayList線程安全問題之前,我們線對此類的源碼進(jìn)行分析,找出可能出現(xiàn)線程安全問題的地方,然后代碼進(jìn)行驗證和分析。

1.1 數(shù)據(jù)結(jié)構(gòu)

ArrayList內(nèi)部是使用數(shù)組保存元素的,數(shù)據(jù)定義如下:

transient Object[] elementData; // non-private to simplify nested class access

在ArrayList中此數(shù)組即是共享資源,當(dāng)多線程對此數(shù)據(jù)進(jìn)行操作的時候如果不進(jìn)行同步控制,即有可能會出現(xiàn)線程安全問題。

1.2 add方法可能出現(xiàn)的問題分析

首先我們看一下add的源碼如下:

public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}

此方法中有兩個操作,一個是數(shù)組容量檢查,另外就是將元素放入數(shù)據(jù)中。我們先看第二個簡單的開始分析,當(dāng)多個線程執(zhí)行順序如下所示的時候,會出現(xiàn)最終數(shù)據(jù)元素個數(shù)小于期望值。

ArrayList源碼和多線程安全問題分析

按照此順序執(zhí)行完之后,我們可以看到,elementData[n]的只被設(shè)置了兩次,第二個線程設(shè)置的值將前一個覆蓋,最后size=n+1。下面使用代碼進(jìn)行驗證此問題。

1.3 代碼驗證

首先先看下以下代碼,開啟1000個線程,同時調(diào)用ArrayList的add方法,每個線程向ArrayList中添加100個數(shù)字,如果程序正常執(zhí)行的情況下應(yīng)該是輸出:

list size is :10000

代碼如下:

private static List<Integer> list = new ArrayList<Integer>();
private static ExecutorService executorService = Executors.newFixedThreadPool(1000);
private static class IncreaseTask extends Thread{
@Override
public void run() {
System.out.println("ThreadId:" + Thread.currentThread().getId() + " start!");
for(int i =0; i < 100; i++){
list.add(i);
}
System.out.println("ThreadId:" + Thread.currentThread().getId() + " finished!");
}
}
public static void main(String[] args){
for(int i=0; i < 1000; i++){
executorService.submit(new IncreaseTask());
}
executorService.shutdown();
while (!executorService.isTerminated()){
try {
Thread.sleep(1000*10);
}catch (InterruptedException e){
e.printStackTrace();
}
}
System.out.println("All task finished!");
System.out.println("list size is :" + list.size());
}

當(dāng)執(zhí)行此main方法后,輸出如下:

ArrayList源碼和多線程安全問題分析

從以上執(zhí)行結(jié)果來看,最后輸出的結(jié)果會小于我們的期望值。即當(dāng)多線程調(diào)用add方法的時候會出現(xiàn)元素覆蓋的問題。

1.4 數(shù)組容量檢測的并發(fā)問題

在add方法源碼中,我們看到在每次添加元素之前都會有一次數(shù)組容量的檢測,add中調(diào)用此方法的源碼如下:

ensureCapacityInternal(size + 1);

容量檢測的相關(guān)源碼如下:

private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}

容量檢測的流程圖如下所示:

ArrayList源碼和多線程安全問題分析

我們以兩個線程執(zhí)行add操作來分析擴(kuò)充容量可能會出現(xiàn)的并發(fā)問題:
當(dāng)我們新建一個ArrayList時候,此時內(nèi)部數(shù)組容器的容量為默認(rèn)容量10,當(dāng)我們用兩個線程同時添加第10個元素的時候,如果出現(xiàn)以下執(zhí)行順序,可能會拋出java.lang.ArrayIndexOutOfBoundsException異常。

ArrayList源碼和多線程安全問題分析

第二個線程往數(shù)組中添加數(shù)據(jù)的時候由于數(shù)組容量為10,而此操作往index為10的位置設(shè)置元素值,因此會拋出數(shù)組越界異常。

1.5 代碼驗證數(shù)組容量檢測的并發(fā)問題

使用如下代碼:

private static List<Integer> list = new ArrayList<Integer>(3);
private static ExecutorService executorService = Executors.newFixedThreadPool(10000);
private static class IncreaseTask extends Thread{
@Override
public void run() {
System.out.println("ThreadId:" + Thread.currentThread().getId() + " start!");
for(int i =0; i < 1000000; i++){
list.add(i);
}
System.out.println("ThreadId:" + Thread.currentThread().getId() + " finished!");
}
}
public static void main(String[] args){
new IncreaseTask().start();
new IncreaseTask().start();
}

執(zhí)行main方法后,我們可以看到控制臺輸出如下:

ArrayList源碼和多線程安全問題分析

1.6 ArrayList中其他方法說明

ArrayList中其他包含對共享變量操作的方法同樣會有并發(fā)安全問題,只需要按照以上的分析方法分析即可。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

本文標(biāo)題:ArrayList源碼和多線程安全問題分析
網(wǎng)頁URL:http://aaarwkj.com/article12/jjihdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站內(nèi)鏈、虛擬主機(jī)、微信小程序、軟件開發(fā)App開發(fā)

廣告

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

成都網(wǎng)頁設(shè)計公司
97国产超碰在线观看| 免费日韩黄片在线观看| 91免费在线观看国产精品| 福利在线视频一区二区| 日韩一区二区三区视频在线看 | 最近中文字幕免费手机版| 精品人妻人伦一区二区三区| 亚洲天堂网免费在线看| 国产产品在线免费看91| 91啪在线观看91色| 99精品欧美一区二区三区视频| 国产精品一区二区久久| 日本高清视频免费一区| 欧美αv一区二区三区| 手机在线观看av网站| 免费无遮挡午夜视频网站| av在线亚洲网站区一| 日本熟女俱乐部一区二区| 小黄片视频免费在线播放| 亚洲精品网站国产高清| 欧美亚洲国产青草久久| 五月婷婷六月丁香激情视频| 亚洲欧美午夜不卡视频| 激情综合色综合久久丁香| 18以下的人禁止看的视频| 精品av一区二区在线| 免费97久久人妻一区精品| 欧美激情欧美精品欧美色浮| 天堂社区人妻在线亚洲| 亚洲国产日韩欧美视频| 禁止未满十八在线观看| 亚洲av成人av天堂| 国语少妇高潮对白在线| 亚洲毛片高清一区二区三区| 中文字幕伦理一区二区三区| 国产女主播在线观看视频| 99久久精品国产熟女拳交| 男女啪啪国产精品视频| 一区二区亚洲成人精品| 精品少妇人妻av不卡久久| 久久久久亚洲av成人|