juc(java.util.concurrent)線程安全集合

? ? ArrayList是非線程安全的,而Vector是線程安全的,其實(shí)現(xiàn)依靠synchronized,效率低。雖然能實(shí)現(xiàn)線程安全,但是不符合高并發(fā)。

? ? 因此有ConcurrentHashMap、CopyOnWriteArraySet寫時(shí)復(fù)制技術(shù)CopyOnWriteArrayList這幾個(gè)集合框架。這里需要理解一個(gè)技術(shù):寫時(shí)復(fù)制技術(shù)。

? ? 為了保證線程安全,又要高并發(fā),所以要并發(fā)讀,獨(dú)占寫。舉個(gè)例子,有一個(gè)集合A,有好多人在讀,但是小李想寫數(shù)據(jù),因此小李先根據(jù)集合A復(fù)制一個(gè)集合B,然后把數(shù)據(jù)寫到集合B,最后,把指向集合A的引用,指向集合B。

代碼:

public class NotSafeDemo {

public static void main(String[] args) {

????//notSafeHashSet

????//noSafeArrayList

? ? ?notSafeHashMap();

}

private static void notSafeHashMap() {

????Map map =new ConcurrentHashMap<>();

????for (int i =0; i <30; i++) {

????????new Thread(() -> {

????????map.put(Thread.currentThread().getName(), UUID.randomUUID().toString().substring(0,4));

????????System.out.println(map);

????????}, String.valueOf(i)).start();

????}

}

private static void notSafeHashSet() {

????Set hashSet =new CopyOnWriteArraySet();

????for (int i =0; i <30; i++) {

????new Thread(() -> {

????????hashSet.add(UUID.randomUUID().toString().substring(0,4));

????????System.out.println(hashSet);

????}, String.valueOf(i)).start();

????}

}

private static void noSafeArrayList() {

List list =new CopyOnWriteArrayList();//寫時(shí)復(fù)制技術(shù)

//并發(fā)寫,會(huì)報(bào)錯(cuò):java.util.ConcurrentModificationException

? ?for (int i =0; i <30; i++) {

????new Thread(() -> {

????????list.add(UUID.randomUUID().toString().substring(0,4));

????????System.out.println(list);

????}, String.valueOf(i)).start();

}

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,142評(píng)論 0 2
  • 四、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 872評(píng)論 0 2
  • 一、 1、請(qǐng)用Java寫一個(gè)冒泡排序方法 【參考答案】 public static void Bubble(int...
    獨(dú)云閱讀 1,496評(píng)論 0 6
  • 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,560評(píng)論 0 4
  • 這某種暫時(shí)不先加以形容的某種情緒 是該給它些空間讓打哈欠伸伸腿之類的有起碼的張力 于是有人專門孕育無聊時(shí)所...
    遠(yuǎn)方之遠(yuǎn)閱讀 308評(píng)論 0 0

友情鏈接更多精彩內(nèi)容