Java基礎之多執行緒二
阿新 • • 發佈:2019-01-23
/* 這是flag=1這個執行緒 */
if (flag == 1) {
synchronized (o1) {
/* 使用synchronized關鍵字把物件01鎖定了 */
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
/*
* 前面已經鎖住了物件o1,只要再能鎖住o2,那麼就能執行打印出1的操作了
* 可是這裡無法鎖定物件o2,因為在另外一個flag=0這個執行緒裡面已經把物件o1給鎖住了
* 儘管鎖住o2這個物件的執行緒會每隔500毫秒睡眠一次,可是在睡眠的時候仍然是鎖住o2不放的
*/
System.out.println("1");
}
}
}
/*
* 這裡的兩個if語句都將無法執行,因為已經造成了執行緒死鎖的問題
* flag=1這個執行緒在等待flag=0這個執行緒把物件o2的鎖解開,
* 而flag=0這個執行緒也在等待flag=1這個執行緒把物件o1的鎖解開
* 然而這兩個執行緒都不願意解開鎖住的物件,所以就造成了執行緒死鎖的問題
*/
if (flag == 1) {
synchronized (o1) {
/* 使用synchronized關鍵字把物件01鎖定了 */
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2) {
/*
* 前面已經鎖住了物件o1,只要再能鎖住o2,那麼就能執行打印出1的操作了
* 可是這裡無法鎖定物件o2,因為在另外一個flag=0這個執行緒裡面已經把物件o1給鎖住了
* 儘管鎖住o2這個物件的執行緒會每隔500毫秒睡眠一次,可是在睡眠的時候仍然是鎖住o2不放的
*/
System.out.println("1");
}
}
}
/*
* 這裡的兩個if語句都將無法執行,因為已經造成了執行緒死鎖的問題
* flag=1這個執行緒在等待flag=0這個執行緒把物件o2的鎖解開,
* 而flag=0這個執行緒也在等待flag=1這個執行緒把物件o1的鎖解開
* 然而這兩個執行緒都不願意解開鎖住的物件,所以就造成了執行緒死鎖的問題
*/