疯狂java学习笔记1023---线程的同步
同步代碼塊:
文件并發(fā)被訪問時(shí)容易造成異常。
?
同步代碼塊語法格式:
synchronized(obj)??
{
??? ...
??? ?//此處的代碼就是同步代碼塊
}
????? obj是同步監(jiān)視器 線程開始執(zhí)行同步代碼塊之前,必須先獲得對(duì)同步監(jiān)視器的鎖定。
注:任何時(shí)刻只能有一條線程可以獲得對(duì)同步監(jiān)視器的鎖定,當(dāng)同步代碼塊執(zhí)行結(jié)束后,該線程自然釋放了對(duì)該同步監(jiān)視器的鎖定。
通常推薦使用可能被并發(fā)訪問的共享資源充當(dāng)同步監(jiān)視器。
?
例:
同步方法:
同步方法就是使用synchronized關(guān)鍵字來修飾某個(gè)方法,則該方法稱為同步方法。
同步方法無需顯示指出同步監(jiān)視器,同步方法的同步監(jiān)視器就是this,也就是該方法本身。
例:
注:synchronized關(guān)鍵字可以修飾方法,可以修飾代碼塊,但不能修飾構(gòu)造器,屬性等。
釋放同步監(jiān)視器的鎖定:
線程會(huì)在如下幾種情況下釋放對(duì)同步監(jiān)視器的鎖定:
1.當(dāng)前線程的同步方法、同步代碼塊執(zhí)行結(jié)束,當(dāng)前線程即釋放同步監(jiān)視器。
2.當(dāng)線程在同步代碼塊、同步方法中遇到break,return終止了該代碼塊、該方法的繼續(xù)執(zhí)行,
當(dāng)前線程將會(huì)釋放同步監(jiān)視器。
3.當(dāng)線程在同步代碼塊、同步方法中出現(xiàn)了未處理的Error或Exception,導(dǎo)致了該代碼塊、該方法異常結(jié)束時(shí)將會(huì)釋放同步監(jiān)視器。
4.當(dāng)線程執(zhí)行同步代碼塊或同步方法時(shí),程序執(zhí)行了同步監(jiān)視器對(duì)象的wait()方法,則當(dāng)前線程暫停,并釋放同步監(jiān)視器。
在下面情況下,線程不會(huì)釋放同步監(jiān)視器:
1、線程執(zhí)行同步代碼塊或同步方法時(shí),程序調(diào)用Thread.sleep()、Thread.yield()方法來暫停當(dāng)前線程的執(zhí)行,當(dāng)前線程不會(huì)釋放同步監(jiān)視器。
2、線程執(zhí)行同步代碼塊時(shí),其他線程調(diào)用了該線程的suspend方法將該線程掛起,該線程不會(huì)釋放同步監(jiān)視器。(應(yīng)盡量避免)
同步鎖(Lock):
使用方法:
?
例:
?
注:使用Lock與使用同步方法有點(diǎn)相似,只是使用Lock時(shí)顯示使用Lock對(duì)象作為同步鎖,而使用同步方式時(shí)系統(tǒng)飲式使用當(dāng)前對(duì)象作為監(jiān)視器,同樣符合“加鎖->訪問->釋放鎖”的操作模式,而且使用Lock對(duì)象時(shí)每個(gè)Lock對(duì)象對(duì)應(yīng)一個(gè)Account對(duì)象,一樣可以保證對(duì)于同一個(gè)Account對(duì)象,同一時(shí)刻只能有一條線程能進(jìn)入臨界區(qū)。
ReentrantLock鎖具有重入性,也就是說線程可以對(duì)他已經(jīng)加鎖的ReentrantLock鎖再次加鎖,線程在每次調(diào)用lock()加鎖后,必須顯示調(diào)用unlock()來釋放鎖,所以一段被鎖保護(hù)的代碼可以調(diào)用另一個(gè)被相同鎖保護(hù)的方法。
?
轉(zhuǎn)載于:https://blog.51cto.com/chengxuyuan/1034833
總結(jié)
以上是生活随笔為你收集整理的疯狂java学习笔记1023---线程的同步的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iptables规则的增删改查
- 下一篇: init/inittab