2015-05-14 7 views
6

Bir çift iş parçacığından düzenli olarak güncelleştirilmekte olan List nesneler var. Güncellenirken bazı öğeleri filtrelemek için bir akış kullanmak istiyorum.Toplama işlemi, akış işlemi gerçekleştirilirken güncelleniyor java 8

Örneğin; O listede

List<MyObject> result = 
myList.stream().filter(myobj->myobjt.isValid()).collect(toList()); 

üzerinde akışı kullanmak zamanında bir noktada Şimdi

List<MyObject> myList 

benim liste gelen güncelleme ediliyor düşünülürse bu iş parçacığı güvenli mi: Düzenli güncellenmektedir listesi var demek iş parçacığı kaç? Aşağıdaki

+4

Hangi Liste uygulamasını kullanıyorsunuz? Listeyi nasıl güncellersiniz (sonuna ekleyerek veya başka şeyler ekleyerek)? Akışınızın bu güncellemelerle ne yapmasını bekliyorsunuz (diğerlerine aldırmayın/dahil edin/başarısız olursunuz)? – Thilo

+0

İplik güvenli toplama yapmak istediğim için CopyOnWriteArrayList kullanıyorum. Sadece listenin sonuna ekledim. Akışımın genel şeyler yapmasını istiyorum. Bu, listedeki nesneleri filtreleyebilir veya güncelleyebilir. Ben sadece bir filtreleme örneği verdim ama görebildiğim – user1409534

cevap

7

Javadoc of CopyOnWriteArrayList durumları:

"anlık" tarzı yineleyici yöntemi yineleyici oluşturulduğu noktadaki dizi durum için bir başvuru kullanır. Bu dizi yineleyicinin ömrü boyunca hiçbir zaman değişmez, bu nedenle girişim imkansızdır ve yineleyicinin ConcurrentModificationException komutunu vermemesi garanti edilir. Yineleyici oluşturulduktan sonra yineleyici, ekleme, kaldırma veya listeyi yansıtmaz.

Evet, kodunuzun threadafe olması gerekir. Akış, başladıktan sonra listeye yapılan tüm eklemeleri yok sayar.

+0

herhangi bir şey olabilir .. ve sadece bir thread bir listeyi güncellerse ve başka bir thread o listede akış işlemini kullanıyorsa ne olur? – user1409534