1. 程式人生 > >synchronized和鎖(ReentrantLock) 區別

synchronized和鎖(ReentrantLock) 區別

區別一:API層面

synchronized使用

synchronized既可以修飾方法,也可以修飾程式碼塊。
synchronized修飾方法時,如下所示:

//synchronized修飾一個方法時,這個方法叫同步方法。
public synchronized void test() {
//方法體``

}

synchroized修飾程式碼塊時,包含兩部分:鎖物件的引用和這個鎖保護的程式碼塊。如下所示:

synchronized(Object) {
//括號中表示需要鎖的物件.
//執行緒執行的時候會對Object上鎖
}

ReentrantLock使用

public
class test(){ private Lock lock = new ReentrantLock(); public void testMethod() { try { lock.lock(); ``` //省略 } finally { lock.unlock(); } } }

區別二:等待可中斷

引用周志明的《深入理解Java虛擬機器》Page 392

等待可中斷是指當持有鎖的執行緒長期不釋放鎖的時候,正在等待的執行緒可以選擇放棄等待,改為處理其他事情。可等待特性對處理執行時間非常長的同步快很有幫助。

具體來說,假如業務程式碼中有兩個執行緒,Thread1 Thread2。假設 Thread1 獲取了物件object的鎖,Thread2將等待Thread1釋放object的鎖。

  • 使用synchronized。如果Thread1不釋放,Thread2將一直等待,不能被中斷。synchronized也可以說是Java提供的原子性內建鎖機制。內部鎖扮演了互斥鎖(mutual exclusion lock ,mutex)的角色,一個執行緒引用鎖的時候,別的執行緒阻塞等待。

  • 使用ReentrantLock。如果Thread1不釋放,Thread2等待了很長時間以後,可以中斷等待,轉而去做別的事情。

區別三:公平鎖

引用周志明的《深入理解Java虛擬機器》Page 392

公平鎖是指多個執行緒在等待同一個鎖時,必須按照申請的時間順序來依次獲得鎖;而非公平鎖則不能保證這一點。非公平鎖在鎖被釋放時,任何一個等待鎖的執行緒都有機會獲得鎖。
synchronized的鎖是非公平鎖,ReentrantLock預設情況下也是非公平鎖,但可以通過帶布林值的建構函式要求使用公平鎖。

區別四:鎖繫結多個條件

ReentrantLock可以同時繫結多個Condition物件,只需多次呼叫newCondition方法即可。
synchronized中,鎖物件的wait()和notify()或notifyAll()方法可以實現一個隱含的條件。但如果要和多於一個的條件關聯的時候,就不得不額外新增一個鎖。

區別五:效能

JDK 1.5中,synchronized還有很大的優化餘地。JDK 1.6 中加入了很多針對鎖的優化措施,synchronized與ReentrantLock效能方面基本持平。虛擬機器在未來的改進中更偏向於原生的synchronized。

補充:關於synchronized關鍵字

  1. Java中每個物件都有一個鎖(lock)或者叫做監視器(monitor)。
  2. ReentrantLock和synchronized持有的物件監視器不同。
  3. 如果某個synchronized方法是static的,那麼當執行緒方法改方法時,它鎖的並不是synchronized方法所在的物件,而是synchronized方法所在物件所對應的Class物件,因為Java中不管一個類有多少物件,這些物件會對應唯一一個Class物件。因此當執行緒分別訪問同一個類的兩個物件的兩個static,synchronized方法時,是順序執行的,亦即一個執行緒先執行,完畢之後,另一個才開始執行。
  4. synchronized 方法是一種粗粒度的併發控制,某一時刻,只能有一個執行緒執行synchronized方法;synchronized塊則是一種細粒度的併發控制。只會將塊中程式碼同步,位於方法內,synchronized塊之外的程式碼是可以被多個執行緒同時訪問的。
  5. synchronized關鍵字經過編譯之後,會在同步塊的前後分別形成monitorenter和monitorexit兩個位元組碼指令,操作物件均為鎖的計數器。
    6.相同點:都是可重入的。可重入值的是同一個執行緒多次試圖獲取它所佔的鎖,請求會成功。當釋放的時候,直到衝入次數清零,鎖才釋放。