??之前學過比較長一段時間的JUC相關的知識,現(xiàn)在想復習一遍,因此在這里做一個簡單的筆記。
??本篇博文都是比較基礎的概念,而且比較簡要,大家如果要深入理解,盡量多看一些高并發(fā)相關的書籍,如果才剛接觸這一塊的同學,建議學習《java并發(fā)編程從入門到精通》,這一本書入門還是很不錯的!
一、volatile
1.什么是volatile
volatile是java虛擬機提供的輕量級的同步機制;
它具有三大特性:
保證可見性;
不保證原子性;
禁止指令重排(有序性)
2.JMM-java內(nèi)存模型特性
可見性、原子性、有序性
3.volatile不保證原子性的問題怎么解決
使用java.util.concurrent.atomic類
AtomicInteger a = new AtomicInteger();
Atomic是怎么實現(xiàn)的呢?
主要是用到了CAS
4.CAS
全稱Compare-and-swap,它是一條CPU并發(fā)原語,它的核心類是Unsafe類,可以直接操作內(nèi)存。(開掛的人生不需要解釋…)
CAS實現(xiàn)了原子性,怎么實現(xiàn)的呢?
CAS原理:CAS有三個操作數(shù):內(nèi)存中V,舊的預期值A,要修改的更新值B;
當且僅當就的預期值A和內(nèi)存值V相同時,將內(nèi)存值V修改為B。
CAS缺點:ABA問題;
有T1和T2兩個線程,T1改一次10s,T2改一次2s,T2先把主內(nèi)存中的A改成B,后面又將B改回為A,這時候輪到T1,發(fā)現(xiàn)主內(nèi)存中的值為自己的期望值,就直接進行修改。這樣首位是一樣的,但中間已經(jīng)被修改過多次了,而T1以為是操作成功的。這樣有可能導致過程存在問題。簡單理解就是貍貓換太子。
如何規(guī)避ABA問題?
使用原子引用更新AtomicStampedReference
二、集合線程安全類
1.ArrayList
ArrayList線程不安全
為什么不安全,因為add()方法沒有加synchronized
而Vector()是線程安全的,因為其add()方法加鎖了
集合線程安全問題拋出的異常
并發(fā)爭搶修改導致
java.util.ConcurrentModificationException
2.解決ArrayList線程不安全
使用Vector()
使用Collections.synchronizedList(new ArrayList<>());
使用寫時復制CopyOnWriteArrayList();
3.寫時復制CopyOnWriteArrayList();
使用了讀寫分離的思想;
寫的時候先將容器復制一份,然后修改其中的元素,最后將引用指向這個新的容器。
4.HashMap與HashSet的聯(lián)系
HashMap的Key是HashSet,而value是一個叫RPESENT的常量
5.HashMap線程不安全怎么辦?
使用ConcurrentHashMap
了解ConcurrentHashMap嗎?
是JUC包中最重要的類
java1.7的ConcurrentHashMap,使用分段鎖技術,可以參考
https://www.cnblogs.com/ITtangtang/p/3948786.html
java1.8的ConcurrentHashMap摒棄了1.7的segment設計,而是在1.8HashMap的基礎上實現(xiàn)了線程安全的版本,即也是采用數(shù)組 鏈表 紅黑樹的形式。
https://www.cnblogs.com/nullzx/p/8647220.html
https://my.oschina.net/pingpangkuangmo/blog/817973
三、鎖
1.公平鎖和非公平鎖
公平鎖:多個線程按照申請鎖的順序來獲取鎖。非公平鎖就是不按順序來,可以隨意插隊。
ReentrantLock默認非公平鎖、synchronized也是非公平鎖
2.可重入鎖(遞歸鎖)
簡單理解:只要拿到一把鑰匙,其中的內(nèi)容都能獲得鎖;
舉例來說,家大門的鎖已經(jīng)開了,其他廚房和廁所的鎖也可以獲得。就是在類中可以把兩個方法理解為同一把鎖。
ReentrantLock和synchronized都是非公平的可重入鎖,主要是為了防止死鎖
3.自旋鎖
一種沒有用到鎖的方式,采用循環(huán)的方式去嘗試獲取鎖。
4.讀寫鎖-獨占鎖(寫鎖)/共享鎖(讀鎖)
ReentrantLock和synchronized都是獨占鎖
ReentrantReadWriteLock的寫鎖是獨占鎖,讀鎖是共享鎖,實現(xiàn)了ReadWriteLock接口
讀寫分別調(diào)用不同的方法
讀調(diào)用writeLock().lock();與writeLock().unlock();
寫調(diào)用readLock().lock();與readLock().unlock();
5. CountDownLatch/CyclicBarrier/Semaphore
三者都是JCU包中的類,一種同步方式
CountDownLatch計數(shù)器,類似倒數(shù)發(fā)送火箭,先完成的就進行等待,每完成一個計數(shù)器減一,直到減為0,也就是所有人完成后才開始下一步,是一種同步方式;
CyclicBarrier則與前者相反,類似集齊七龍珠召喚神龍,先完成的就進行等待,每完成一個計數(shù)器加一,直到加到期望值,也就是所有人完成后才開始下一步,也是一種同步方式;
Semapho信號燈(信號量):常用于多個線程爭奪多個資源的情況,比如去網(wǎng)紅店吃飯需要排隊,后來的先在外面等待,里面每走一桌就進一桌人。
6. JUC加鎖的方法:
synchronized,Lock,ReadWriteLock,Semapho
來源:https://www./content-4-408951.html
|