淺談java中死鎖問題


知識點:死鎖的產生、死鎖的實例

一:死鎖的產生

我們在解決多線程共享資源的線程同步問題時,會使用synchronized關鍵字修飾方法或者通過Lock加鎖方式修飾方法、代碼塊,防止多個線程訪問統一資源產生的線程安全問題。但是當線程X持有鎖A,等待鎖B,而線程Y此時持有鎖B,等待鎖A時,就會出現X,Y兩個線程互相等待的情況,這種情況就是死鎖。

 

二:死鎖實例

實例1  在下面的簡單實例中,我們同時開啟兩個線程X、Y,線程X加sb1鎖后,會在再次加sb2鎖,線程Y加sb2鎖后,會在再次加sb1鎖,當線程X加sb1鎖后,會在再次加sb2鎖,同時線程Y加sb2鎖后,再次等待X持有的sb1鎖時,就會出現相互等待,便產生了死鎖問題。

 

public class TestDeadLock {

static StringBuffer sb1=new StringBuffer(); //聲明兩個靜態StringBuffer對象實例
static StringBuffer sb2=new StringBuffer();

public static void main(String[] args) {
new Thread(){ //聲明兩個線程實例,並start()啟動線程,線程X
@Override
public void run() {
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (sb1){ //加sb1鎖后,向sb1對象加“A”字符串
sb1.append("A");
synchronized (sb2){ //加sb2鎖后,向sb2對象加“B”字符串
sb2.append("B");
System.out.println(sb1);
System.out.println(sb2);
}
}
}
}.start();

new Thread(){ 線程Y
@Override
public void run() {
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (sb2){
//加sb2鎖后,向sb1對象加“C”字符串
sb1.append("C");
synchronized (sb1){ //加sb1鎖后,向sb1對象加“D”字符串
sb2.append("D");
System.out.println(sb1);
System.out.println(sb2);
}
}
}
}.start();
}
}





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM