我們先來(lái)看ArrayList的文字描述部分,第一句就表明了ArrayList類是實(shí)現(xiàn)List接口的動(dòng)態(tài)數(shù)組
下面這段文字描述說(shuō)了ArrayList有個(gè)默認(rèn)的容量,隨著元素的增加乔询,容量會(huì)自動(dòng)擴(kuò)容
jdk1.8的源碼钞支,默認(rèn)容量是10
這段文字說(shuō)明了塘幅,ArrayList不是線程安全的骤竹,可以使用 List list = Collections.synchronizedList(new ArrayList(...));這個(gè)進(jìn)行實(shí)現(xiàn),這是線程同步的
為什么用Collections.synchronizedList()就是線程安全的,?我們來(lái)看一下Collections.synchronizedList()的源碼俄认,
這段代碼說(shuō)如果list是RandomAccess的實(shí)例个少,則返回SynchronizedRandomAccessList的實(shí)例,來(lái)我們看看ArrayList是否繼承了RandomAccess
果然源碼中顯示ArrayList繼承了RandomAccess的實(shí)例眯杏,那我們?cè)賮?lái)看看
我們看到subList方法是加了鎖夜焦,而這個(gè)類繼承了SynchronizedList,我們看看SynchronizedList的實(shí)現(xiàn)方法
我們看到SynchronizedList的add,get,set,remove等方法都加了鎖
總結(jié)一下:ArrayList不是線程安全的岂贩,如果我們要在多線程中使用ArrayList茫经,比如一個(gè)線程做增加操作,一個(gè)線程做刪除操作萎津,我們可以使用?List list = Collections.synchronizedList(new ArrayList(...));
口說(shuō)無(wú)憑卸伞,兩種想法我們用代碼測(cè)試下:
線程不安全寫法:
線程安全寫法:
我連續(xù)跑了多次,返回的記過(guò)都是33和44
總上:如果在多線程操作同一個(gè)ArrayList對(duì)象锉屈,線程安全的做法是Collections.synchronizedList(new ArrayList<>())