當多個執行緒同時共享訪問同一資料時,每個執行緒都嘗試操作該資料,從而導致改資料被破壞,這種現象稱為爭用條件。
同步的實現:wait(),notify(),notifyall()
當乙個執行緒要訪問共享資源,首先要拿到鎖後進入臨界區,如果發現某些條件不符合,呼叫wait方法釋放鎖資源,執行緒進入鎖物件上的wait set,
拿到鎖的當前執行程序執行完時呼叫notify()會喚醒鎖資源所持有的等待區域中的一條執行緒(隨機),使該執行緒有機會競爭cpu資源;
呼叫notifyall()會喚醒鎖資源所持有的等待區域中的所有執行緒,使這些執行緒有機會競爭cpu資源;
public死鎖問題:class
testsync implements runnable
public
void
run()
}class
timer
catch
(interruptedexception e) {}
system.
out.println(name+"
, 你是第
"+num+"
個使用timer的執行緒");
//}}}
publicenergysystem:class testdeadlock implements
runnable
catch
(exception e)
synchronized
(o2) }}
if(flag == 0)
catch
(exception e)
synchronized
(o1) }}
}
public
static
void
main(string args)
}
/**energytransfertask:* 宇宙的能量系統
* 遵循能量守恆定律:
* 能量不會憑空創生或消失,只會從一處轉移到另一處 */
public
class
energysystem
/*** 能量的轉移,從乙個盒子到另乙個盒子
* @param
from 能量源
* @param
to 能量終點
* @param
amount 能量值
*/public
void transfer(int from, int to, double
amount)
catch
(interruptedexception e)
}system.out.println(thread.currentthread().getname());
energyboxes[from] -=amount;
"從%d轉移%10.2f單位能量到%d", from, amount, to);
energyboxes[to] +=amount;
" 能量總和:%10.2f%n", gettotalenergies());
//喚醒所有在lockobj物件上等待的執行緒
lockobj.notifyall();}}
//獲取能量世界的能量總和
public
double
gettotalenergies()
//返回能量盒子的長度
public
intgetboxamount()
}
publicclass energytransfertask implements
runnable
public
void
run()
}catch
(interruptedexception e)}}
publicenergysystemtestclass
energysystemtest }}
輸出結果:
在for迴圈中from是遞加的,但結果並不是從0,1,2.......按順序轉移?
雖然程序按順序創造task但start方法不會等到run方法執行完就會繼續執行下面的**,所以導致建立了很多執行緒但他們隨機執行run方法。
關於鎖:synchronized與volatile恐怕比較一下volatile和synchronized的不同是最容易解釋清楚的。volatile是變數修飾符,而synchronized則作用於一段**或方法;看如下三句get**:
多執行緒 執行緒互動
在實際功能中,會存在一些執行緒互動的情況。比如 乙個執行緒執行某個操作,當操作的物件到達某種狀態時,會等待其他執行緒來執行。下面 的功能是,乙個執行緒對乙個數字執行減少方法,當減到1時,等待增加執行緒操作。public class thread interactive extends thread ...
多執行緒三(互動)
1 wait notify notifyall 這單個方法是屬於object類的方法 wait 導致當前的執行緒等待,直到其他執行緒呼叫此物件的notify 方法或notifyall 方法 notify 喚醒在此物件監視器等待的乙個執行緒 notifyall 喚醒在此物件監視器上等待的所有執行緒 2...
010 多執行緒互動
1 使用join執行緒間排隊 2 使用wait notify 進行執行緒間互動 3 使用 countdownlatch進行執行緒互動等待執行緒id 11正在等待其他執行緒 等待執行緒id 11汽車 完成執行緒id 21正在工作 執行緒id 16正在工作 執行緒id 17正在工作 執行緒id 13正在...