※ 引述《yangpika (狗狗洋ˇ洋)》之銘言:
: 現在有兩個object o1跟o2
: o1有兩個synchronized method m1,m2
: o2有一個synchronized method m3
: 現在有兩個thread t1,t2
: t1會call m1 m1內部會呼叫 m3 且m3會執行wait()
: 在這情況下
: t2是不是無法執行m2
: 因為wait只是釋放o2的lock 不會釋放o1的lock
: 那有辦法釋放o1跟o2的lock嗎??
你這樣寫, 不如寫一個範例吧...
class Foo {
private Bar bar;
public synchronized foo1() {
bar.bar1();
}
public synchronized foo2() {
}
}
class Bar {
public synchronized bar1() {
wait();
}
}
類似這樣吧
有人 invoke foo1() 的話, 的確那個 foo instance
的 monitor 會被佔著, 另一 thread invoke foo2 會
等. 這是正常也是正確的吧.
把 foo 的 monitor 也放走的話, 反而會出問題. 會不
會你該想一想, 是不是有設計上的問題才導致這種情況?
我會建議把要 lock 的對象集中為一個, 比如 foo2() 不是
synchronized method, 而是裡面一開始就 synchronized(bar) {...}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.155.236.82