在学习lock与synchronize的区别时,看到这样一句话:“ lock更灵活,可以自由定义多把锁的枷锁解锁顺序(synchronized要按照先加的后解顺序)”。请问这里:
1.lock的自由定义多把锁的枷锁解锁顺序怎么理解? 2.synchronized要按照先加的后解顺序怎么理解?
谢谢各位!
走同样的路,发现不同的人生
Lock是一個接口,最常用的實作是 ReentrantLock,它的一個靈活之處是可以設定fair參數。
synchronized 和fair=false的ReentrantLock 無法決定加鎖順序。換句話說,線程A、B、C都要鎖定對象,嘗試鎖定的時間是A最早、然後是B,最後是C,那麼當A解鎖對象時,不能確定到底B還是C接下來鎖定對象。
如果用fair=true的ReentrantLock(公平鎖),情況就確定了:A解鎖對象時,由於B比C先嘗試鎖定對象,所以接下來一定是B來鎖定,只有當B解鎖時才輪到C 。
new lock1 new lock2 lock1.lock(); lock2.lock(); ... lock2.unlock(); lock1.unlock();
Lock的加解鎖是在java語意層面上實現的,鎖之間沒有必然關係
Lock
synchronized(obj1){ synchronized(obj2){ ... } }
synchronized加解锁是由JVM来实现,在执行完synchronized块后自行解锁,所有会按照synchronized的巢狀順序解鎖。
synchronized
Lock是一個接口,最常用的實作是 ReentrantLock,它的一個靈活之處是可以設定fair參數。
synchronized 和fair=false的ReentrantLock 無法決定加鎖順序。換句話說,線程A、B、C都要鎖定對象,嘗試鎖定的時間是A最早、然後是B,最後是C,那麼當A解鎖對象時,不能確定到底B還是C接下來鎖定對象。
如果用fair=true的ReentrantLock(公平鎖),情況就確定了:A解鎖對象時,由於B比C先嘗試鎖定對象,所以接下來一定是B來鎖定,只有當B解鎖時才輪到C 。
Lock
的加解鎖是在java語意層面上實現的,鎖之間沒有必然關係synchronized
加解锁是由JVM来实现,在执行完synchronized
块后自行解锁,所有会按照synchronized
的巢狀順序解鎖。