1. 程式人生 > >Synchronize 和 Lock 的區別與用法

Synchronize 和 Lock 的區別與用法

一、synchronized和lock的用法區別

 
(1)synchronized(隱式鎖):在需要同步的物件中加入此控制,synchronized可以加在方法上,也可以加在特定程式碼塊中,括號中表示需要鎖的物件。
 
(2)lock(顯示鎖):需要顯示指定起始位置和終止位置。一般使用ReentrantLock類做為鎖,多個執行緒中必須要使用一個ReentrantLock類做為對 象才能保證鎖的生效。且在加鎖和解鎖處需要通過lock()和unlock()顯示指出。所以一般會在finally塊中寫unlock()以防死鎖。
 

二、synchronized和lock效能區別

 
synchronized是託管給JVM執行的,而lock是java寫的控制鎖的程式碼
。在Java1.5中,synchronize是效能低效的。因為 這是一個重量級操作,需要呼叫操作介面,導致有可能加鎖消耗的系統時間比加鎖以外的操作還多。相比之下使用Java提供的Lock物件,效能更高一些。但 是到了Java1.6,發生了變化。synchronize在語義上很清晰,可以進行很多優化,有適應自旋,鎖消除,鎖粗化,輕量級鎖,偏向鎖等等。導致 在Java1.6上synchronize的效能並不比Lock差。
 

三、synchronized和lock機制區別


(1)synchronized原始採用的是CPU悲觀鎖機制,即執行緒獲得的是獨佔鎖。獨佔鎖意味著其 他執行緒只能依靠阻塞來等待執行緒釋放鎖。
(2)Lock用的是樂觀鎖方式
。所謂樂觀鎖就是,每次不加鎖而是假設沒有衝突而去完成某項操作,如果因為衝突失敗就重試,直到成功為止。樂觀鎖實現的機制就 是CAS操作(Compare and Swap)。