ReentrantLock和Synchronized對比
阿新 • • 發佈:2019-02-05
ReentrantLock
類實現了 Lock,
擁有Synchronized相同的併發性和記憶體語義,此外還多了鎖投票,定時鎖等候和中斷鎖等候,在激烈爭用情況下效能更好
Lock
和
synchronized 有一點明顯的區別 —— lock 必須在 finally 塊中釋放。否則,如果受保護的程式碼將丟擲異常,鎖就有可能永遠得不到釋放。
用法對比:
package Lock; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SynDemo { public static void main(String[] arg){ Runnable t1=new MyThread(); new Thread(t1,"t1").start(); new Thread(t1,"t2").start(); } } /* 使用synchronized */ /*class MyThread implements Runnable { @Override public void run() { synchronized (this) { for(int i=0;i<10;i++) System.out.println(Thread.currentThread().getName()+":"+i); } } */ /*使用ReentrantLock*/ class MyThread implements Runnable { private Lock lock=new ReentrantLock(); public void run() { lock.lock(); try{ for(int i=0;i<5;i++) System.out.println(Thread.currentThread().getName()+":"+i); }finally{ lock.unlock(); //一定要記得釋放鎖 } } }
reentrantlock的優點
- 可以新增多個檢控條件, 如果使用synchronized,則只能使用一個. 使用 reentrant locks 可以有多個wait()/notify() 佇列. [譯註:直接多new 幾個ReentrantLock就可以了,不同的場景/條件用不同的ReentrantLock ]
- 可以控制執行緒得到鎖的順序,也就是有公平鎖(按照進入順序得到資源),也可以不按照順就像.synchronized 一樣.
- 可以檢視鎖的狀態, 鎖是否被鎖上了.
- 可以檢視當前有多少執行緒再等待鎖.
reentrantlock的缺點
- 需要使用import 引入相關的Class
- 不能忘記在finally 模組釋放鎖,這個看起來比synchronized 醜陋
- synchronized可以放在方法的定義裡面, 而reentrantlock只能放在塊裡面. 比較起來, synchronized可以減少巢狀