1. 程式人生 > >java併發和多執行緒

java併發和多執行緒

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)