1.同步:多個(gè)線(xiàn)程需要對(duì)同一數(shù)據(jù)的存取。兩銀行賬戶(hù)資金互轉(zhuǎn),如果兩個(gè)線(xiàn)程同時(shí)取A賬戶(hù)金額100,轉(zhuǎn)50給賬戶(hù)B,A賬戶(hù)只減了50,B賬戶(hù)卻加了100;
2.鎖對(duì)象:synchronized;Lock l=new ReentrantLock();
ReentrantLock()如果傳入true,得到一個(gè)公平策略鎖對(duì)象,等待時(shí)間越長(zhǎng)的線(xiàn)程越容易獲得該鎖,該鎖會(huì)大大降低性能。
l.lock()加鎖;l.unlock()釋放鎖;為了防止程序拋出異常,不釋放鎖從而造成死鎖,應(yīng)該在finally塊中釋放鎖;
3.條件對(duì)象:當(dāng)線(xiàn)程進(jìn)入臨界區(qū),卻發(fā)現(xiàn)只有某一條件滿(mǎn)足之后才能執(zhí)行,要用條件對(duì)象管理那些獲得了鎖卻不能做有用工作的線(xiàn)程。
銀行賬戶(hù)轉(zhuǎn)賬問(wèn)題說(shuō)明:一個(gè)線(xiàn)程獲得鎖對(duì)象,進(jìn)行轉(zhuǎn)賬時(shí)發(fā)現(xiàn)賬戶(hù)余額不足,就不能進(jìn)行轉(zhuǎn)賬,其他線(xiàn)程也不能對(duì)該賬戶(hù)進(jìn)行存錢(qián),因?yàn)殒i具有排它性,所有需要條件對(duì)象。
鎖對(duì)象調(diào)用newCondition()獲得條件對(duì)象Cindition,條件對(duì)象.await()當(dāng)前對(duì)象阻塞并放棄鎖;signal()隨機(jī)解除當(dāng)前條件對(duì)象的等待集中某個(gè)線(xiàn)程的阻塞狀態(tài),signalAll()解除當(dāng)前條件對(duì)象等待集中所有線(xiàn)程。
await()用法:
while(條件判斷){Condition對(duì)象.await();? }
解除阻塞并得到鎖的線(xiàn)程會(huì)從阻塞的地方開(kāi)始執(zhí)行。
4.synchronized:每個(gè)對(duì)象有個(gè)內(nèi)部鎖,該鎖有個(gè)內(nèi)部條件,內(nèi)部鎖控制要進(jìn)入synchronized方法的線(xiàn)程,內(nèi)部條件管理調(diào)用了wait()的線(xiàn)程。
盡量不使用synchronized與Lock/Condition而使用concurrent包工具。
5.同步阻塞:進(jìn)入一個(gè)同步阻塞獲得鎖synchronized(obj){。。。}
6.監(jiān)視器: