Java 提供了兩種鎖機制來控制多個線程對共享資源的互斥訪問,個是 JVM 實現(xiàn)的 synchronized,而另一個是 JDK 實現(xiàn)的 ReentrantLock。
1. 鎖的實現(xiàn)
synchronized 是 JVM 實現(xiàn)的,而 ReentrantLock 是 JDK 實現(xiàn)的。
2. 性能
新版本 Java 對 synchronized 進行了很多優(yōu)化,例如自旋鎖等,synchronized 與 ReentrantLock 大致相同。
3. 等待可中斷
當持有鎖的線程長期不釋放鎖的時候,正在等待的線程可以選擇放棄等待,改為處理其他事情。 ReentrantLock 可中斷,而 synchronized 不行。
4. 公平鎖
公平鎖是指多個線程在等待同一個鎖時,必須按照申請鎖的時間順序來依次獲得鎖。 synchronized 中的鎖是非公平的,ReentrantLock 默認情況下也是非公平的,但是也可以是公平的。
5. 鎖綁定多個條件
一個 ReentrantLock 可以同時綁定多個 Condition 對象。