1.同步:多個線程需要對同一數(shù)據(jù)的存取。兩銀行賬戶資金互轉(zhuǎn)念秧,如果兩個線程同時取A賬戶金額100淤井,轉(zhuǎn)50給賬戶B,A賬戶只減了50摊趾,B賬戶卻加了100币狠;
2.鎖對象:synchronized;Lock l=new ReentrantLock()砾层;
ReentrantLock()如果傳入true漩绵,得到一個公平策略鎖對象,等待時間越長的線程越容易獲得該鎖肛炮,該鎖會大大降低性能止吐。
l.lock()加鎖宝踪;l.unlock()釋放鎖;為了防止程序拋出異常碍扔,不釋放鎖從而造成死鎖瘩燥,應(yīng)該在finally塊中釋放鎖;
3.條件對象:當(dāng)線程進(jìn)入臨界區(qū)不同,卻發(fā)現(xiàn)只有某一條件滿足之后才能執(zhí)行厉膀,要用條件對象管理那些獲得了鎖卻不能做有用工作的線程。
銀行賬戶轉(zhuǎn)賬問題說明:一個線程獲得鎖對象套鹅,進(jìn)行轉(zhuǎn)賬時發(fā)現(xiàn)賬戶余額不足站蝠,就不能進(jìn)行轉(zhuǎn)賬,其他線程也不能對該賬戶進(jìn)行存錢卓鹿,因為鎖具有排它性菱魔,所有需要條件對象。
鎖對象調(diào)用newCondition()獲得條件對象Cindition吟孙,條件對象.await()當(dāng)前對象阻塞并放棄鎖澜倦;signal()隨機解除當(dāng)前條件對象的等待集中某個線程的阻塞狀態(tài),signalAll()解除當(dāng)前條件對象等待集中所有線程杰妓。
await()用法:
while(條件判斷){Condition對象.await()藻治;? }
解除阻塞并得到鎖的線程會從阻塞的地方開始執(zhí)行。
4.synchronized:每個對象有個內(nèi)部鎖巷挥,該鎖有個內(nèi)部條件桩卵,內(nèi)部鎖控制要進(jìn)入synchronized方法的線程,內(nèi)部條件管理調(diào)用了wait()的線程倍宾。
盡量不使用synchronized與Lock/Condition而使用concurrent包工具雏节。
5.同步阻塞:進(jìn)入一個同步阻塞獲得鎖synchronized(obj){。高职。钩乍。}
6.監(jiān)視器: