java併發和多執行緒
阿新 • • 發佈:2018-11-21
volatile—保證可見性、禁止指令重排序,不保證原子性
出於執行速率的考慮,java編譯器會把經常訪問的變數存放在快取,直接從快取中讀取變數,多執行緒下記憶體與快取不一樣
volatile不會被快取到暫存器,多執行緒下可見
使用條件:
- 只有單個執行緒更新變數的值
- 該變數不與其他變數一起納入不變性條件中
- 訪問變數時不需要加鎖
synchronized
主動釋放鎖——發生異常,主動釋放,不會死鎖
synchronized修飾多執行緒讀,會阻塞
synchronized(this)與synchronized(static XXX)的區別
synchronized就是針對記憶體區塊申請記憶體鎖,this關鍵字代表類的一個物件,所以其記憶體鎖是針對相同物件的互斥操作,而static成員屬於類專有,其記憶體空間為該類所有成員共有,這就導致synchronized()對static成員加鎖,相當於對類加鎖,也就是在該類的所有成員間實現互斥,在同一時間只有一個執行緒可訪問該類的例項。
Lock
手動釋放鎖
ReentrantLock:實現了Lock介面
ReadWriteLock(讀寫鎖—介面)
多個執行緒之間可以同時讀
可重入鎖(synchronized,ReentrantLock):執行緒可以進入它已經擁有的鎖所同步的程式碼(鎖計數器實現)
可中斷鎖(Lock):執行緒A正執行鎖中的程式碼,B正等待獲取該鎖,由於等待時間過長,B響應中斷去處理別的事情
公平鎖(ReentrantLock—可設定):以請求鎖的順序來獲取鎖,即等待時間最長的
非公平鎖(synchronized):無法保證等待的執行緒獲取鎖的順序
讀寫鎖(ReentrantReadWriteLock)