【多線程】線程同步 synchronized
由于同一進(jìn)程的多個(gè)線程共享同一塊存儲(chǔ)空間 , 在帶來(lái)方便的同時(shí),也帶來(lái)了訪問 沖突問題 , 為了保證數(shù)據(jù)在方法中被訪問時(shí)的正確性 , 在訪問時(shí)加入 鎖機(jī)制synchronized , 當(dāng)一個(gè)線程獲得對(duì)象的排它鎖 , 獨(dú)占資源 , 其他線程必須等待 , 使用后釋放鎖即可 . 存在以下問題 :
- 一個(gè)線程持有鎖會(huì)導(dǎo)致其他所有需要此鎖的線程掛起 ;
- 在多線程競(jìng)爭(zhēng)下 , 加鎖 , 釋放鎖會(huì)導(dǎo)致比較多的上下文切換 和 調(diào)度延時(shí),引 起性能問題 ;
- 如果一個(gè)優(yōu)先級(jí)高的線程等待一個(gè)優(yōu)先級(jí)低的線程釋放鎖 會(huì)導(dǎo)致優(yōu)先級(jí)倒 置 , 引起性能問題 。
同步方法
由于我們可以通過 private 關(guān)鍵字來(lái)保證數(shù)據(jù)對(duì)象只能被方法訪問 , 所以我們只需 要針對(duì)方法提出一套機(jī)制 , 這套機(jī)制就是 synchronized 關(guān)鍵字 , 它包括兩種用法 synchronize方法和synchronized 塊 。
//同步方法
public synchronized void method(int args){}
synchronized方法控制對(duì) “對(duì)象” 的訪問 , 每個(gè)對(duì)象對(duì)應(yīng)一把鎖 , 每個(gè) synchronized方法都必須獲得調(diào)用該方法的對(duì)象的鎖才能執(zhí)行 , 否則線程會(huì)阻塞 , 方法一旦執(zhí)行 , 就獨(dú)占該鎖 , 直到該方法返回才釋放鎖 , 后面被阻塞的線程才能獲 得這個(gè)鎖 , 繼續(xù)執(zhí)行。
-
若將一個(gè)大的方法申明為synchronized 將會(huì)影響效率。
-
方法里面需要修改的內(nèi)容才需要鎖, 鎖的太多 ,浪費(fèi)資源。
同步塊
//同步塊
synchronized (Obj){}
-
Obj 稱之為 同步監(jiān)視器
-
Obj 可以是任何對(duì)象 , 但是推薦使用共享資源作為同步監(jiān)視器
-
同步方法中無(wú)需指定同步監(jiān)視器 , 因?yàn)橥椒椒ǖ耐奖O(jiān)視器就是this , 就是 這個(gè)對(duì)象本身 , 或者是 class
-
-
同步監(jiān)視器的執(zhí)行過程
- 第一個(gè)線程訪問 , 鎖定同步監(jiān)視器 , 執(zhí)行其中代碼 。
- 第二個(gè)線程訪問 , 發(fā)現(xiàn)同步監(jiān)視器被鎖定 , 無(wú)法訪問 。
- 第一個(gè)線程訪問完畢 , 解鎖同步監(jiān)視器 。
- 第二個(gè)線程訪問, 發(fā)現(xiàn)同步監(jiān)視器沒有鎖 , 然后鎖定并訪。

浙公網(wǎng)安備 33010602011771號(hào)