亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 Java Java基礎(chǔ) synchronized和Lock的差別是什麼?

synchronized和Lock的差別是什麼?

Nov 19, 2020 am 11:38 AM
java lock synchronized

區(qū)別:1、lock是一個(gè)接口,而synchronized是java的一個(gè)關(guān)鍵字。 2.synchronized在發(fā)生異常時(shí)會(huì)自動(dòng)釋放佔(zhàn)有的鎖,因此不會(huì)出現(xiàn)死鎖;而lock發(fā)生異常時(shí),不會(huì)主動(dòng)釋放佔(zhàn)有的鎖,必須手動(dòng)來釋放鎖,可能引起死鎖的發(fā)生。

synchronized和Lock的差別是什麼?

在分散式開發(fā)中,鎖定是執(zhí)行緒控制的重要途徑。 Java為此也提供了2種鎖定機(jī)制,synchronized和lock。

0、synchronized實(shí)作原理

Java中每個(gè)物件都可以當(dāng)作鎖,這是synchronized實(shí)作同步的基礎(chǔ):

  • #普通同步方法,鎖定是目前實(shí)例物件

  • #靜態(tài)同步方法,鎖定是目前類別的class物件

  • 同步方法區(qū)塊,鎖是括號(hào)裡面的物件
    當(dāng)一個(gè)執(zhí)行緒存取同步程式碼區(qū)塊時(shí),它首先是需要被鎖,當(dāng)退出或拋出例外時(shí)必須要釋放鎖,那麼它是如何來實(shí)現(xiàn)這個(gè)機(jī)制的呢?我們先看一段簡單的程式碼:

package cn.alibab.javap;public class SynchronizedTest {

    public synchronized void test1(){

    }    public void test2(){        synchronized (this){

        }
    }
}

利用javap工具(javap是java編譯之後的class檔案的分解器)查看產(chǎn)生的class檔案資訊來分析Synchronized的實(shí)作

synchronized和Lock的差別是什麼?

synchronized和Lock的差別是什麼?
從上面可以看出,同步程式碼區(qū)塊是使用monitorenter和monitorexit指令實(shí)現(xiàn)的,同步方法(在這看不出來需要看JVM底層實(shí)現(xiàn))依賴的是方法修飾符上的ACC_SYNCHRONIZED實(shí)作。

同步程式碼區(qū)塊:monitorenter指令是在編譯後插入到同步程式碼區(qū)塊的起始位置,monitorexit指令插入到同步程式碼區(qū)塊的結(jié)束位置,JVM需要保證每一個(gè)monitorenter都有一個(gè)monitorexit與之相對(duì)應(yīng)。任何物件都有一個(gè)monitor與之相關(guān)聯(lián),當(dāng)且一個(gè)monitor被持有之後,他將處於鎖定狀態(tài)。當(dāng)執(zhí)行緒執(zhí)行到monitorenter指令時(shí),將會(huì)嘗試取得物件所對(duì)應(yīng)的monitor所有權(quán),即嘗試取得物件的鎖定;【摘自並發(fā)程式設(shè)計(jì)藝術(shù)】

同步方法:synchronized方法則會(huì)被翻譯成普通的方法呼叫和返回指令如:invokevirtual、areturn指令,在VM字節(jié)碼層面並沒有任何特別的指令來實(shí)現(xiàn)被synchronized修飾的方法,而是在Class文件的方法表中將該方法的access_flags欄位中的synchronized標(biāo)誌位置1,表示該方法是同步方法並使用呼叫該方法的物件或該方法所屬的Class在JVM的內(nèi)部物件表示Klass做為鎖定物件。 (摘自:http://www.cnblogs.com/javaminer/p/3889023.html)

synchronized與lock的差別

synchronized和Lock的差別是什麼?




  • 差異如下:

  • 來源:

    lock是一個(gè)接口,而synchronized是java的一個(gè)關(guān)鍵字,synchronized是內(nèi)建的語言實(shí)作;

  • #異常是否釋放鎖:

    synchronized在發(fā)生異常時(shí)候會(huì)自動(dòng)釋放佔(zhàn)有的鎖,因此不會(huì)出現(xiàn)死鎖;而lock發(fā)生異常時(shí)候,不會(huì)主動(dòng)釋放佔(zhàn)有的鎖,必須手動(dòng)unlock來釋放鎖,可能引起死鎖的發(fā)生。 (所以最好將同步程式碼區(qū)塊用try catch包起來,finally中寫入unlock,避免死鎖的發(fā)生。)
  • 是否回應(yīng)中斷
  • lock等待鎖定過程中可以用interrupt來中斷等待,而synchronized只能等待鎖的釋放,不能回應(yīng)中斷;

是否知道取得鎖定

Lock可以透過trylock來知道有沒有取得鎖,而synchronized不能;

Lock可以提高多個(gè)執(zhí)行緒進(jìn)行讀取操作的效率。 (可以透過readwritelock實(shí)現(xiàn)讀寫分離)

在效能上來說,如果競爭資源不激烈,兩者的效能是差不多的,而當(dāng)競爭資源非常激烈時(shí)(即有大量線程同時(shí)競爭),此時(shí)Lock的性能要遠(yuǎn)遠(yuǎn)優(yōu)於synchronized。所以說,在具體使用時(shí)要根據(jù)適當(dāng)情況選擇。


###synchronized使用Object物件本身的wait 、notify、notifyAll調(diào)度機(jī)制,而Lock可以使用Condition進(jìn)行執(zhí)行緒之間的調(diào)度,##########
//Condition定義了等待/通知兩種類型的方法
Lock lock=new ReentrantLock();
Condition condition=lock.newCondition();...condition.await();...condition.signal();
condition.signalAll();
## ####1、synchronized和lock的用法區(qū)別#########synchronized:在需要同步的物件中加入此控制,synchronized可以加在方法上,也可以加在特定程式碼區(qū)塊中,括號(hào)中表示需要鎖的物件。 ######lock:一般使用ReentrantLock類別做為鎖。在加鎖和解鎖處需要透過lock()和unlock()顯示指出。所以一般會(huì)在finally區(qū)塊寫unlock()以防死鎖。 #########2、synchronized和lock效能差異#########synchronized是託管給JVM執(zhí)行的, ### 而lock是java寫的控制鎖的程式碼。 ###

在Java1.5中,synchronize是效能低效的。因?yàn)檫@是一個(gè)重量級(jí)操作,需要呼叫操作接口,導(dǎo)致有可能加鎖消耗的系統(tǒng)時(shí)間比加鎖以外的操作還多。相較之下使用Java提供的Lock對(duì)象,效能更高一些。

但是到了Java1.6,發(fā)生了變化。 synchronize在語意上很清晰,可以進(jìn)行很多優(yōu)化,有適應(yīng)自旋,鎖消除,鎖粗化,輕量級(jí)鎖,偏向鎖等等。導(dǎo)致在Java1.6上synchronize的效能並不比Lock差。官方也表示,他們也更支援synchronize,在未來的版本還有優(yōu)化空間。

2種機(jī)制的具體差異:
synchronized原始採用的是CPU悲觀鎖定機(jī)制,即執(zhí)行緒取得的是獨(dú)佔(zhàn)鎖定。 獨(dú)佔(zhàn)鎖定意味著其他執(zhí)行緒只能依靠阻塞來等待執(zhí)行緒釋放鎖定。而在CPU轉(zhuǎn)換執(zhí)行緒阻塞時(shí)會(huì)造成執(zhí)行緒上下文切換,當(dāng)有很多執(zhí)行緒競爭鎖的時(shí)候,會(huì)造成CPU頻繁的上下文切換導(dǎo)致效率很低。

而Lock用的是樂觀鎖方式。所謂樂觀鎖就是,每次不加鎖而是假設(shè)沒有衝突而去完成某項(xiàng)操作,如果因?yàn)樾n突失敗就重試,直到成功為止。樂觀鎖實(shí)現(xiàn)的機(jī)制就是CAS操作(Compare and Swap)。我們可以進(jìn)一步研究ReentrantLock的原始碼,會(huì)發(fā)現(xiàn)其中比較重要的獲得鎖定的一個(gè)方法是compareAndSetState。這裡其實(shí)就是所呼叫的CPU提供的特殊指令。

現(xiàn)代的CPU提供了指令,可以自動(dòng)更新共享數(shù)據(jù),而且能夠偵測到其他執(zhí)行緒的干擾,而 compareAndSet() 就用這些取代了鎖定。這個(gè)演算法稱作非阻塞演算法,意思是一個(gè)執(zhí)行緒的失敗或掛起不應(yīng)該影響其他執(zhí)行緒的失敗或掛起的演算法。

3、synchronized和lock用途區(qū)別

synchronized原語和ReentrantLock在一般情況下沒有什麼區(qū)別,但是在非常複雜的同步應(yīng)用中,請考慮使用ReentrantLock,特別是遇到下面2種需求的時(shí)候。

1.某個(gè)執(zhí)行緒在等待一個(gè)鎖的控制權(quán)的這段時(shí)間需要中斷
2.需要分開處理一些wait-notify,ReentrantLock裡面的Condition應(yīng)用,能夠控制notify哪個(gè)執(zhí)行緒
3.具有公平鎖定功能,每個(gè)到來的線程都將排隊(duì)等候

下面細(xì)細(xì)道來…

先說第一種情況,ReentrantLock的lock機(jī)制有2種,忽略中斷鎖和回應(yīng)中斷鎖,這給我們帶來了很大的靈活性。例如:如果A、B 2個(gè)線程去競爭鎖,A線程得到了鎖,B線程等待,但是A線程這個(gè)時(shí)候?qū)嵲谟刑嗍虑橐幚恚褪且恢辈环祷?,B線程可能就會(huì)等不及了,想中斷自己,不再等待這個(gè)鎖了,轉(zhuǎn)而處理其他事情。這時(shí)候ReentrantLock就提供了2種機(jī)制:可中斷/可不中斷
第一,B線程中斷自己(或者別的線程中斷它),但是ReentrantLock不去回應(yīng),繼續(xù)讓B線程等待,你再怎麼中斷,我全當(dāng)耳邊風(fēng)(synchronized原語就是如此);
第二,B線程中斷自己(或者別的線程中斷它),ReentrantLock處理了這個(gè)中斷,並且不再等待這個(gè)鎖的到來,完全放棄。

更多程式相關(guān)知識(shí),請?jiān)煸L:程式設(shè)計(jì)影片! !

以上是synchronized和Lock的差別是什麼?的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級(jí)或工作區(qū)級(jí)路徑,用於自定義VSCode設(shè)置。 1.用戶級(jí)路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級(jí)路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

See all articles