我總是很猶豫要把我的鎖公開,讓他們公開。我總是試圖將鎖限制在我的實現中。我相信,不這樣做,是僵局的祕訣。我應該同步偵聽器通知嗎?
我有以下類:
class SomeClass {
protected ArrayList<Listener> mListeners = new ArrayList<Listener>();
protected void addListener(Listener listener) {
synchronized (mListeners) {
mListeners.add(listener);
}
}
protected void removeListener(Listener listener) {
synchronized (mListeners) {
mListeners.remove(listener);
}
}
...
}
當SomeClass的要通知他的聽衆,你會怎麼做:
synchronized (mListeners) {
for (Listener l : mListeners) {
l.event();
}
}
或
Listener[] listeners = null;
synchronized (mListeners) {
listeners = mListeners.toArray();
}
for (Listener l : listeners) {
l.event();
}
我會選擇第二個選項。缺點是聽衆可以獲得事件,即使他們已經沒有註冊。好處在於,一個偵聽器calllback正在等待的線程在他想要註銷一個偵聽器時不會遇到死鎖。我認爲上漲比下跌更重要,這可以很容易地記錄下來。
所以這裏的問題基本上是:你會暴露你的鎖嗎?
我的問題是,如果你會選擇一個普通的ArrayList,LinkedList,ConcurrentLinkedQueue,CopyOnWriteArrayList,...!您是否會介意聽衆是否可以在未註冊時收到通知。你是否會把鎖打開,或者沒有。這是關於避免死鎖,或者不。
請分享您的想法。謝謝!
使用[synchronizedList](http://docs.oracle.com/javase/6/docs/api/java/util/Collections html的#synchronizedList(java.util.List中))。對於通知,循環周圍的同步塊很好。 – aishwarya
'CopyOnWriteArrayList'適用於遍歷比更新更普遍的情況。 – artbristol
請閱讀我的編輯。這是關於鎖,而不是關於容器。 –