區別:1、lock是一個接口,而synchronized是java的一個關鍵字。2、synchronized在發生異常時會自動釋放占有的鎖,因此不會出現死鎖;而lock發生異常時,不會主動釋放占有的鎖,必須手動來釋放鎖,可能引起死鎖的發生。
在分布式開發中,鎖是線程控制的重要途徑。Java為此也提供了2種鎖機制,synchronized和lock。
0、synchronized實現原理
Java中每一個對象都可以作為鎖,這是synchronized實現同步的基礎:
普通同步方法,鎖是當前實例對象
靜態同步方法,鎖是當前類的class對象
同步方法塊,鎖是括號里面的對象
當一個線程訪問同步代碼塊時,它首先是需要得到鎖,當退出或者拋出異常時必須要釋放鎖,那么它是如何來實現這個機制的呢?我們先看一段簡單的代碼:
package cn.alibab.javap;public class SynchronizedTest { public synchronized void test1(){ } public void test2(){ synchronized (this){ } }}
利用javap工具(javap是java編譯之后的class文件的分解器)查看生成的class文件信息來分析Synchronized的實現
從上面可以看出,同步代碼塊是使用monitorenter和monitorexit指令實現的,同步方法(在這看不出來需要看JVM底層實現)依靠的是方法修飾符上的ACC_SYNCHRONIZED實現。
同步代碼塊:monitorenter指令是在編譯后插入到同步代碼塊的開始位置,monitorexit指令插入到同步代碼塊的結束位置,JVM需要保證每一個monitorenter都有一個monitorexit與之相對應。任何對象都有一個monitor與之相關聯,當且一個monitor被持有之后,他將處于鎖定狀態。線程執行到monitorenter指令時,將會嘗試獲取對象所對應的monitor所有權,即嘗試獲取對象的鎖;【摘自并發編程藝術】
同步方法:synchronized方法則會被翻譯成普通的方法調用和返回指令如:invokevirtual、areturn指令,在VM字節碼層面并沒有任何特別的指令來實現被synchronized修飾的方法,而是在Class文件的方法表中將該方法的access_flags字段中的synchronized標志位置1,表示該方法是同步方法并使用調用該方法的對象或該方法所屬的Class在JVM的內部對象表示Klass做為鎖對象。(摘自:http://www.cnblogs.com/javaminer/p/3889023.html)
synchronized和lock的區別
區別如下:
來源:
lock是一個接口,而synchronized是java的一個關鍵字,synchronized是內置的語言實現;
異常是否釋放鎖:
synchronized在發生異常時候會自動釋放占有的鎖,因此不會出現死鎖;而lock發生異常時候,不會主動釋放占有的鎖,必須手動unlock來釋放鎖,可能引起死鎖的發生。(所以最好將同步代碼塊用try catch包起來,finally中寫入unlock,避免死鎖的發生。)
是否響應中斷
lock等待鎖過程中可以用interrupt來中斷等待,而synchronized只能等待鎖的釋放,不能響應中斷;
是否知道獲取鎖
Lock可以通過trylock來知道有沒有獲取鎖,而synchronized不能;
Lock可以提高多個線程進行讀操作的效率。(可以通過readwritelock實現讀寫分離)
在性能上來說,如果競爭資源不激烈,兩者的性能是差不多的,而當競爭資源非常激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優于synchronized。所以說,在具體使用時要根據適當情況選擇。
synchronized使用Object對象本身的wait 、notify、notifyAll調度機制,而Lock可以使用Condition進行線程之間的調度,
//Condition定義了等待/通知兩種類型的方法Lock lock=new ReentrantLock();Condition condition=lock.newCondition();...condition.await();...condition.signal();condition.signalAll();
1、synchronized和lock的用法區別
synchronized:在需要同步的對象中加入此控制,synchronized可以加在方法上,也可以加在特定代碼塊中,括號中表示需要鎖的對象。
lock:一般使用ReentrantLock類做為鎖。在加鎖和解鎖處需要通過lock()和unlock()顯示指出。所以一般會在finally塊中寫unlock()以防死鎖。
2、synchronized和lock性能區別
synchronized是托管給JVM執行的,
而lock是java寫的控制鎖的代碼。
在Java1.5中,synchronize是性能低效的。因為這是一個重量級操作,需要調用操作接口,導致有可能加鎖消耗的系統時間比加鎖以外的操作還多。相比之下使用Java提供的Lock對象,性能更高一些。
但是到了Java1.6,發生了變化。synchronize在語義上很清晰,可以進行很多優化,有適應自旋,鎖消除,鎖粗化,輕量級鎖,偏向鎖等等。導致在Java1.6上synchronize的性能并不比Lock差。官方也表示,他們也更支持synchronize,在未來的版本中還有優化余地。
2種機制的具體區別:
synchronized原始采用的是CPU悲觀鎖機制,即線程獲得的是獨占鎖。獨占鎖意味著其他線程只能依靠阻塞來等待線程釋放鎖。而在CPU轉換線程阻塞時會引起線程上下文切換,當有很多線程競爭鎖的時候,會引起CPU頻繁的上下文切換導致效率很低。
而Lock用的是樂觀鎖方式。所謂樂觀鎖就是,每次不加鎖而是假設沒有沖突而去完成某項操作,如果因為沖突失敗就重試,直到成功為止。樂觀鎖實現的機制就是CAS操作(Compare and Swap)。我們可以進一步研究ReentrantLock的源代碼,會發現其中比較重要的獲得鎖的一個方法是compareAndSetState。這里其實就是調用的CPU提供的特殊指令。
現代的CPU提供了指令,可以自動更新共享數據,而且能夠檢測到其他線程的干擾,而 compareAndSet() 就用這些代替了鎖定。這個算法稱作非阻塞算法,意思是一個線程的失敗或者掛起不應該影響其他線程的失敗或掛起的算法。
3、synchronized和lock用途區別
synchronized原語和ReentrantLock在一般情況下沒有什么區別,但是在非常復雜的同步應用中,請考慮使用ReentrantLock,特別是遇到下面2種需求的時候。
1.某個線程在等待一個鎖的控制權的這段時間需要中斷
2.需要分開處理一些wait-notify,ReentrantLock里面的Condition應用,能夠控制notify哪個線程
3.具有公平鎖功能,每個到來的線程都將排隊等候
下面細細道來……
先說第一種情況,ReentrantLock的lock機制有2種,忽略中斷鎖和響應中斷鎖,這給我們帶來了很大的靈活性。比如:如果A、B 2個線程去競爭鎖,A線程得到了鎖,B線程等待,但是A線程這個時候實在有太多事情要處理,就是一直不返回,B線程可能就會等不及了,想中斷自己,不再等待這個鎖了,轉而處理其他事情。這個時候ReentrantLock就提供了2種機制:可中斷/可不中斷
第一,B線程中斷自己(或者別的線程中斷它),但是ReentrantLock不去響應,繼續讓B線程等待,你再怎么中斷,我全當耳邊風(synchronized原語就是如此);
第二,B線程中斷自己(或者別的線程中斷它),ReentrantLock處理了這個中斷,并且不再等待這個鎖的到來,完全放棄。
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
住房公積金結息是什么意思?住房公積金結息通俗的說就是住房公積金跟存錢一樣開始每年都會核算利息了。公積金計算利息一般分為兩個情況,一種情況是繳納的公積金在上一年的所有余額結算的部分,按照銀行方面的相關利率進行結算利息;另一種情況是住房公積金本年度的每個月繳納的全部金額,按照銀行方面的相關利率進行結算利息,到每年年底都會計算到本年度結束的所有余額當中。公積金年度結息如何計算?公積金年度結息分為兩個部分...
國債逆回購利率正常是多少?3%,國債逆回購一般是三個點左右的平均利率,好的話可能有3.5%,國債逆回購利率不是固定的,不同期限的國債逆回購利率也會有所不同,一般在月底或者年底的時候,銀行缺錢時國債逆回購的利率會高一些。收益該怎么計算?債券逆回購收益=成交額×年收益率×實際占款天數/365天。實際占款天數,是指當次回購交易的首次交收日(含)至到期交收日(不含)的實際日歷天數。...
(資料圖片)2022年8月LPR利率報價公布。據數據顯示,新一期貸款市場報價利率(LPR):1年期LPR為3.65%,5年期以上LPR為4.3%,分別較上月下調5個基點和15個基點,這也是5年期以上LPR今年第三次下調。據媒體稱,LPR下降后,多個地區的銀行分支行及網點首套房貸款利率隨5年期以上LPR進行下調。目前,北上廣深四大一線城市首套房貸款利率均降至5%以下,蘇州、呼和浩特等地首套房貸款利率...