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