在 jdk 1.6 之前,synchronized 是重量級鎖,效率低下。
從 jdk 1.6 開始,synchronized 做了很多優化,如偏向鎖、輕量級鎖、自旋鎖、適應性自旋鎖、鎖消除、鎖粗化等技術來減少鎖操作的開銷。
synchronized 同步鎖一共包含四種狀態:無鎖、偏向鎖、輕量級鎖、重量級鎖,它會隨著競爭情況逐漸公升級。synchronized 同步鎖可以公升級但是不可以降級,目的是為了提高獲取鎖和釋放鎖的效率。
synchronized 修飾的**塊
通過反編譯.class檔案,通過檢視位元組碼可以得到:在**塊中使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步**塊的開始位置,monitorexit 指令指明同步**塊的結束位置。
synchronized 修飾的方法
同樣檢視位元組碼可以得到:在同步方法中會包含 acc_synchronized 標記符。該標記符指明了該方法是乙個同步方法,從而執行相應的同步呼叫。
物件鎖:使用 synchronized 修飾非靜態的方法以及 synchronized(this) 同步**塊使用的鎖是物件鎖。
類鎖:使用 synchronized 修飾靜態的方法以及 synchronized(class) 同步**塊使用的鎖是類鎖。
私有鎖:在類內部宣告乙個私有屬性如private object lock,在需要加鎖的同步塊使用 synchronized(lock)
它們的特性:
由私有鎖實現的等待/通知機制:
object lock =
newobject()
;// 由等待方執行緒實現
synchronized
(lock)
}// 由通知方執行緒實現
synchronized
(lock)
reentrantlock 是乙個獨佔/排他鎖。相對於 synchronized,它更加靈活。但是需要自己寫出加鎖和解鎖的過程。它的靈活性在於它擁有很多特性。
reentrantlock 需要顯示地進行釋放鎖。特別是在程式異常時,synchronized 會自動釋放鎖,而 reentrantlock 並不會自動釋放鎖,所以必須在 finally 中進行釋放鎖。它的特性:
reentrantlock 是很多類的基礎,例如 concurrenthashmap 內部使用的 segment 就是繼承 reentrantlock,copyonwritearraylist 也使用了 reentrantlock。
它擁有讀鎖(readlock)和寫鎖(writelock),讀鎖是乙個共享鎖,寫鎖是乙個排他鎖。
它的特性:
上面提到的 reentrantlock、reentrantreadwritelock 都是基於 abstractqueuedsynchronizer (aqs),而 aqs 又是基於 cas。cas 的全稱是 compare and swap(比較與交換),它是一種無鎖演算法。
synchronized、lock 都採用了悲觀鎖的機制,而 cas 是一種樂觀鎖的實現。
cas 的特性:
cas 存在的問題:
condition 用於替代傳統的 object 的 wait()、notify() 實現執行緒間的協作。
在 condition 物件中,與 wait、notify、notifyall 方法對應的分別是 await、signal 和 signalall。
condition 必須要配合 lock 一起使用,乙個 condition 的例項必須與乙個 lock 繫結。
它的特性:
semaphore、countdownlatch、cyclicbarrier 都是併發工具類。
semaphore 可以指定多個執行緒同時訪問某個資源,而 synchronized 和 reentrantlock 都是一次只允許乙個執行緒訪問某個資源。由於 semaphore 適用於限制訪問某些資源的執行緒數目,因此可以使用它來做限流。
semaphore 並不會實現資料的同步,資料的同步還是需要使用 synchronized、lock 等實現。
它的特性:
countdownlatch 可以看成是乙個倒計數器,它允許乙個或多個執行緒等待其他執行緒完成操作。因此,countdownlatch 是共享鎖。
countdownlatch 的 countdown() 方法將計數器減1,await() 方法會阻塞當前執行緒直到計數器變為0。
按是否鎖住同步資源
鎖住同步資源失敗後,執行緒是否阻塞
多個執行緒競爭鎖時,是否排隊/公平
可重入性
多個執行緒是否共享一把鎖
python鎖 python中的各種鎖
一 全域性直譯器鎖 gil 1 什麼是全域性直譯器鎖 在同乙個程序中只要有乙個執行緒獲取了全域性直譯器 cpu 的使用許可權,那麼其他的執行緒就必須等待該執行緒的全域性直譯器 cpu 使 用權消失後才能使用全域性直譯器 cpu 即時多個執行緒直接不會相互影響在同乙個程序下也只有乙個執行緒使用cpu,...
iOS 中的各種鎖
在日常開發過程中,為了提公升程式執行效率,以及使用者體驗,我們經常使用多執行緒。在使用多執行緒的過程中,難免會遇到資源競爭問題。我們採用鎖的機制來確保執行緒安全。執行緒安全 當乙個執行緒訪問資料的時候,其他的執行緒不能對其進行訪問,直到該執行緒訪問完畢。即,同一時刻,對同乙個資料操作的執行緒只有乙個...
併發中的各種鎖
1.執行緒是否要鎖住同步資源 鎖住 悲觀鎖 不鎖住 樂觀鎖 2.鎖住同步資源失敗執行緒是否要阻塞 不阻塞 自旋鎖 適應性自旋鎖 3.synchronized關鍵字優化之後的幾個狀態流 無鎖 偏向鎖 輕量級鎖 重量級鎖 4.多個執行緒競爭鎖時是否排隊 排隊 公平鎖 先嘗試插隊 直接搶鎖 插隊失敗再排隊...