2012-03-28 63 views
0

請參見下面的代碼:如何鎖定可以在迭代SynchronizedList時列出自己?

List list = Collections.synchronizedList(new ArrayList()); 
    // ... 
    synchronized (list) { 
     Iterator i = list.iterator(); // Must be in synchronized block 
     while (i.hasNext()) 
      foo(i.next()); 
    } 

我知道迭代一個synchronied列表時,主叫方應該同步,但爲什麼用「清單」的鎖我無法理解。 Inner SynchronizedList類,私有成員互斥鎖是鎖。所以如果調用者使用「list」作爲鎖,調用者和內部之間的鎖是不同的。我認爲這個事實讓同步毫無意義。

回答

2

您可以看到Collections.synchronizedList的代碼。然後你會發現synchronizedList的實現在添加或移除方法時使用「this」來鎖定。這裏你鎖定「list」以防止調用「add」或「remove」方法。

+0

我看到Collections.synchronizedList的代碼,並發現鎖是「互斥體」而不是「this」。所以我很困惑...... – 2012-03-28 07:09:39

+0

你可以在這裏看到代碼,「mutex = this」(SynchronizedList是SynchronizedCollection的一個子類,在SynchronizedCollection的構造方法中):http://www.grepcode.com/file/repository .grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Collections.java#1602 – zsxwing 2012-03-28 07:13:32

+0

哦,我現在明白了。我很粗心。謝謝您的回答。 – 2012-03-28 07:16:53

1

由於爲了使迭代原子和線程安全,您需要使用與synchronizedList相同的鎖,這恰好是the list itself。在代碼中,默認的構造函數使用這個作爲互斥體:

​​
+0

爲什麼碰巧是列表本身?這是關鍵...... – 2012-03-28 07:14:10

+0

也謝謝你。我知道私人成員「互斥體」就是「這個」,現在我很清楚。 – 2012-03-28 07:18:55