更新時(shí)間:2020-01-18 14:58:55 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽4084次

作用和用法
在多線程對(duì)共享資源進(jìn)行并發(fā)訪問方面,JDK提供了synchronized關(guān)鍵字來(lái)進(jìn)行線程同步,實(shí)現(xiàn)多線程并發(fā)訪問的線程安全。synchronized的作用主要體現(xiàn)在三個(gè)方面:(1)確保線程互斥地訪問同步代碼;(2)保證共享變量的線程可見性;(3)禁止指令重排。其中(2)和(3)相當(dāng)于volatile關(guān)鍵字的作用。
synchronized可以用在代碼的以下地方:
(1)靜態(tài)方法:將類對(duì)象自身作為monitor對(duì)象,對(duì)該類所有使用了sychronized修飾的靜態(tài)方法進(jìn)行同步,即任何時(shí)候只能存在一個(gè)線程在調(diào)用該類的使用了synchronized修飾的靜態(tài)方法,其他調(diào)用了該類的使用了synchronized修飾的靜態(tài)方法的線程需要阻塞;
(2)普通成員方法:使用類的對(duì)象實(shí)例作為monitor對(duì)象,該類所有使用了synchronized修飾的成員方法,在任何時(shí)刻只能被一個(gè)線程訪問,其他線程需要阻塞;
(3)代碼塊:使用某個(gè)對(duì)象作為monitor對(duì)象,通常為一個(gè)普通的private成員變量,如private Object object = new Object();,這樣所有使用了該object對(duì)象的同步塊,在任何時(shí)候只能存在一個(gè)線程訪問。
synchronized可以與monitor對(duì)象的wait,notify,notifyAll方法一起來(lái)使用,實(shí)現(xiàn)線程之間的通信,如實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者模型。其中多個(gè)線程共享一個(gè)monitor對(duì)象,在線程持有synchronized鎖時(shí),才能調(diào)用monitor的wait,notify或者notifyAll,分別用于釋放monitor鎖,阻塞休眠,等待其他線程;通知和喚醒其中一個(gè)阻塞休眠的線程,讓該線程去獲取monitor鎖;通知所有阻塞休眠的線程去競(jìng)爭(zhēng)monitor鎖。
synchronized使用方便,無(wú)需顯示地在應(yīng)用代碼中加鎖和解鎖,只需在對(duì)應(yīng)的方法或者代碼塊中使用synchronized關(guān)鍵字修飾即可,由JVM自身實(shí)現(xiàn)自動(dòng)地加鎖和釋放鎖。
synchronized修飾的范圍越小,線程并發(fā)度越高,性能越好,所以通常使用同步代碼塊,而不是同步方法來(lái)縮小同步范圍,優(yōu)化性能。

以上就是動(dòng)力節(jié)點(diǎn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java多線程原理:synchronized同步鎖的使用”的內(nèi)容,希望對(duì)大家有幫助,如有疑問,請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。
相關(guān)內(nèi)容
java多線程的狀態(tài)轉(zhuǎn)換以及基本操作
相關(guān)閱讀
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)