2011-05-20 22 views
12

Ben bir ArrayList önbelleğe ve süresiz birden çok iş parçacığı arasında paylaşılan gerekmektedir. Operasyonlar sık ​​sık ekler ve kaldırır, artı zaman zaman yinelenen içerir. bu bilgilere erişimi yöneten bir sarıcı sınıfındaalternatif, ara sıra ilerlerken

ArrayList hayatlar:

public class MyListWrapper<T> implements Iterable<T> { 

    private List<T> innerList = new ArrayList<T>(); 

    public Iterator<T> iterator() { 
     return innerList.listIterator(); 
    } 

    public void add(T element) { 
     innerList.add(element); 
     //app-specific logic 
    } 

    //remove(T), etc in the same pattern... 
} 

Şu anda iplik güvenliği için hazırlıklar yapıyorum. İlk başta, CopyOnWriteArrayList en iyi cevap gibi görünüyordu, ancak performansları beni ilgilendiriyor, çünkü değişiklikler her şeyden daha sık yapılacaktır.

Bu gibi sarıcı sınıfa manuel değişiklik daha iyi bir alternatif ?:

public Iterator<T> iterator() { 
    return new ArrayList<T>(innerList).listIterator(); 
} 

//plus concurrency tweaks for any non-atomic modifications to innerList 

beni en iyi yaklaşım bulmama yardım et olurdu.

cevap

7

Bu size (1) eklemek ve kaldırmak O yakınlarındaki verecek eşzamanlı karma set verecek bir Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>()); kullanarak deneyebilirsiniz.

+0

Mükemmel, bu tam olarak ihtiyacım olan şey. Bana bir şey öğretmek için +1. Teşekkürler –

+0

Yineleyici iş parçacığı için güvenlidir, böylece eşitlemeniz gerekmez ve bir kopyasını almanız gerekmeyebilir. –

+0

java 1.8 ben metot Collections.newSetFromMap –

4

bir olasılık yerine listesi Sıra arayüzü ile yaşama şansı varken ConcurrentLinkedQueue kullanmaktır. Beklediğinizden daha fazla kullanım durumunun bir Kuyruktan memnun olabileceğini iddia ediyorum. Listenin bir önemli avantajı rasgele erişimdir (indekse göre), ancak eşzamanlı bir durumda rasgele erişim ne gerekli ne de istenir.

ConcurrentLinkedQueue Kuyruğu mükemmel eşzamanlı uygulamasıdır.

+0

+1 Bu soruya rastgele erişimin önemsiz olduğunu ve ilk etapta bir Listenin kullanılmasının gereksiz olduğunu sorduğumdan farkettim. –