6 回答

TA貢獻1815條經驗 獲得超10個贊
1、用了synchronized修飾了方法,又用synchronized修飾方法體,這兩者是等效的,都是獲得this(MyStack)的對象監視器并且臨界區也是一致的,同是因為synchronized是可重入的,所以你這樣用不會發生錯誤,但是這是不必要的;
2、可能會發生 @房管局規劃部 中出現的錯誤,wait()可能出現假喚醒,而不滿足臨界條件,后續邏輯就會異常。
可以參看jdk wait()方法的注釋描述:
所以,應該是這樣:
synchronized( method_or_shared_object){
while(list.size()<=0)
wait();
// pop something...
}
一般來說,都需要在while(condition) wait()來防止假喚醒。

TA貢獻1811條經驗 獲得超6個贊

TA貢獻1784條經驗 獲得超9個贊
首先synchronized修飾方法的問題
對于非static方法,其作用相當于synchronized(this):
synchronized void method(){
// method body
}
// 等價于
void method() {
synchronized(this){
// method body
}
}
對于static方法,其相當于synchronized(YourClass.class):
class YourClass {
synchronized static void method() {
// method body
}
// 等價于
static void method() {
synchronized(YourClass.class) {
// method body
}
}
}
其次關于假喚醒問題,就是@spance說的。官方docde描述是:
A thread can also wake up without being notified, interrupted, or timing out, a so-called spurious wakeup.
官方給出的解決方案是:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
添加回答
舉報