線程(第三部分)
本文章作者為yupic1(e小白網(wǎng)站用戶名)。e小白網(wǎng)址:www.e-xiaobai.com?
同步方法
由于我們可以通過private關(guān)鍵字來保證數(shù)據(jù)對象只能被方法訪問,所以我們只需要針對方法提出一套機制,這套機制就是synchronized關(guān)鍵字,它包括兩種用法:synchronized方法和synchronized塊。
同步方法:public synchronized void method(int args){}
synchronized方法控制對“對象”的訪問,每個對象對應(yīng)一把鎖,每個synchronized方法都必須獲得調(diào)用該方法的對象的鎖才能執(zhí)行,否則線程會阻塞,方法一旦執(zhí)行,就獨占該鎖,知道方法返回才釋放鎖,后面被阻塞的線程才能獲得這個鎖,繼續(xù)執(zhí)行。
缺陷:若將一個大的方法聲明為synchronized將會影響效率
把修改對象的方法聲明為synchronized。
共享的資源在哪個類里面就鎖對應(yīng)的實體類。
死鎖
產(chǎn)生死鎖的四個必要條件:
互斥條件:一個資源每次只能被一個線程使用。
請求與保持條件:一個進程因請求資源而被阻塞時,對已獲得的資源保持不放
不剝奪條件:進程以獲得的資源,在未使用完之前,不能強行剝奪
循環(huán)等待條件:若干進程之間,形成一種首尾相接的循環(huán)等待資源關(guān)系
上面列出了死鎖的四個必要條件,我們只要想辦法破其中任意一個或多個就可以避免死鎖的發(fā)生。
Lock(鎖)
從JDK5.0開始,Java提供了更強大的線程同步機制--通過顯式定義同步鎖對象來實現(xiàn)同步。同步鎖使用Lock對象充當。
java.util.concurrent.locks.Lock接口是控制多個資源對共享資源進行訪問的工具。鎖提供了對共享資源的獨占訪問,每次只能有一個線程對Lock對象加鎖,線程開始訪問共享資源之前應(yīng)先獲得Lock對象。
ReentrantLock類實現(xiàn)了Lock,它擁有與synchronized相同的并發(fā)性和內(nèi)存語義,在實現(xiàn)線程安全的控制中,比較常用的是ReentrantLock,可以顯示加鎖,釋放鎖。
由于篇幅問題,文章部分內(nèi)容省略。詳細內(nèi)容可在e小白網(wǎng)站(www.e-xiaobai.com)進行查看【版權(quán)聲明:本文為e小白網(wǎng)站www.e-xiaobai.com的原創(chuàng)作品,需經(jīng)e小白網(wǎng)站或作者本人同意許可后,方可轉(zhuǎn)發(fā)到其它網(wǎng)站平臺上,否則我們有保留追究法律責(zé)任的權(quán)利】