synchronized 和 ReentrantLock的區別

synchronized 是 Java 內建的同步機制,因此也有人稱其爲 Intrinsic Locking,它提供了互斥的語義和可見性,當一個線程已經獲取當前鎖時,其餘試圖獲取的線程只能等待或者阻塞在那裏。性能

在 Java 5 之前,synchronized 是僅有的同步手段,在代碼中, synchronized 能夠用來修飾方法,也可使用在特定的代碼塊兒上,本質上 synchronized 方法等同於把方法所有語句用 synchronized 塊包起來。編碼

ReentrantLock,一般翻譯爲再入鎖,是 Java 5 提供的鎖實現,它的語義和 synchronized 基本相同。再入鎖經過代碼直接調用 lock() 方法獲取,代碼書寫也更加靈活。與此同時,ReentrantLock 提供了不少實用的方法,可以實現不少 synchronized 沒法作到的細節控制,好比能夠控制 fairness,也就是公平性,或者利用定義條件等。可是,編碼中也須要注意,必需要明確調用 unlock() 方法釋放,否則就會一直持有該鎖。線程

synchronized 和 ReentrantLock 的性能不能一律而論,早期版本 synchronized 在不少場景下性能相差較大,在後續版本進行了較多改進,在低競爭場景中表現可能優於 ReentrantLock。翻譯

相關文章
相關標籤/搜索