2016-01-04 81 views
5

我決定挖成源代碼位和注意到Collections.synchronizedList(List)如下實現的:迭代同步包裝是否安全?

public static <T> List<T> synchronizedList(List<T> list) { 
    return (list instanceof RandomAccess ? 
     new SynchronizedRandomAccessList<T>(list) : 
     new SynchronizedList<T>(list)); 
} 

其中SynchronizedList嵌套類是:

static class SynchronizedList<E> 
extends SynchronizedCollection<E> 
      implements List<E> { 
    private static final long serialVersionUID = -7754090372962971524L; 
    final List<E> list; 

    SynchronizedList(List<E> list) { 
     super(list); 
     this.list = list; 
    } 
    SynchronizedList(List<E> list, Object mutex) { 
     super(list, mutex); 
     this.list = list; 
    } 

    public boolean More ...equals(Object o) { 
     synchronized(mutex) {return list.equals(o);} 
    } 

    //ommited 

    public void add(int index, E element) { 
     synchronized(mutex) {list.add(index, element);} 
    } 

    public E remove(int index) { 
     synchronized(mutex) {return list.remove(index);} 
    } 

    //rest is ommited 
} 

如蜜蜂看出,類useses一個private鎖定對象以提供線程安全性。但是the documentation允許我們使用工廠方法返回的objetct上的鎖定來遍歷它。

當務之急是用戶迭代它時,返回 名單上手動同步:

所以,我們使用不同的鎖迭代和修改列表(addremove等)。

爲什麼它被認爲是安全的?

+0

_So,我們使用不同的鎖進行迭代和修改list_什麼讓你這麼想? –

+0

@SotiriosDelimanolis我引用的源代碼。在嵌套類中,我們使用同步(互斥),這是外部不可訪問的。 –

回答

7

Collections#synchronizedList方法

public static <T> List<T> synchronizedList(List<T> list) { 
    return (list instanceof RandomAccess ? 
      new SynchronizedRandomAccessList<>(list) : 
      new SynchronizedList<>(list)); 
} 

使用的是你已經在你的問題出單參數的構造函數。該構造函數調用將this設置爲的超級構造函數。所有的方法是​​mutex,this

該文檔告訴您也要在迭代時同步實例。該參考文獻與方法體內的this相同。

所有這些操作都是(應該,如果你這樣做的話),因此共享相同的鎖。

相關問題