2016-01-04 27 views
5

Ben kaynak koduna biraz kazmak karar verdi ve şöyle Collections.synchronizedList(List) uygulandığını fark ettik: SynchronizedList iç içe sınıftırSenkronize edilmiş sargılar üzerinde yineleme güvenli midir?

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

:

görülen arı gibi
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 
} 

, sınıf bir useses Diş güvenliği sağlamak için private kilit nesnesi. Ancak, the documentation, fabrika yöntemiyle döndürülen objetct üzerinde kilitleme kullanarak bunun üzerinden yineleme yapmamıza izin verir.

O bitti yineleme kullanıcı el döndü listesinde senkronize zorunludur:

Yani, biz (add, remove vs.) listesini yineleme ve değiştirme için farklı kilitler kullanın.

Neden güvenli kabul edilir?

+0

_So, listeyi yinelemek ve değiştirmek için farklı kilitler kullanıyoruz. –

+0

@SotiriosDelimanolis Alıntı yaptığım kaynak kod. Yuvalanmış sınıfta, dışarıdan erişilemeyen senkronize (muteks) kullanırız. –

cevap

7

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

kullanan Collections#synchronizedList yöntem, söz konusu gösterdiğim tek parametreli yapıcı. Bu kurucu, 'u mutex olarak ayarlayan süper kurucuyu çağırır. Tüm yöntemler, mutex, this, synchronized.

Dokümantasyon, yinelemeyi yaparken örnek üzerinde de senkronizasyon yapmanızı anlatıyor. Bu referans, yöntem gövdeleri içinde this ile aynıdır.

Tüm bu eylemler (doğru yaparsanız), aynı kilidi paylaşmalıdır.

İlgili konular