1) CopyOnWriteArraySet
Oldukça basit bir uygulamadır - temel olarak bir dizideki öğelerin bir listesine sahiptir ve listeyi değiştirirken diziyi kopyalar. Şu anda çalışan yinelemeler ve diğer erişim işlemleri eski diziyle devam eder, bu da okuyucular ve yazarlar arasında eşitleme zorunluluğunu ortadan kaldırır (ancak yazmanın kendisinin senkronize edilmesi gerekir). contains()
Diziler doğrusal zamanda aranacağından, normalde hızlı ayarlanan işlemler (özellikle ) burada oldukça yavaştır.
Bunu sadece sık sık okunacak (yinelenecek) ve nadiren değiştirilecek gerçekten küçük setler için kullanın. (Swing dinleyici setleri bir örnek olabilir, ancak bunlar gerçekten set değildir ve yine de sadece EDT'den kullanılmalıdır.)
2) Collections.synchronizedSet
sadece senkronize bir bloğu orijinal kümenin her yönteminin etrafına sarar. Orijinal sete doğrudan erişmemelisiniz. Bu, kümenin iki yönteminin aynı anda yürütülemeyeceği anlamına gelir (biri diğeri bitene kadar engellenir) - bu iş parçacığı için güvenlidir, ancak birden çok iş parçacığı gerçekten seti kullanıyorsa eşzamanlılığınız olmayacaktır. Yineleyiciyi kullanırsanız, yineleyici aramaları arasında kümeyi değiştirirken ConcurrentModificationExceptions öğesinden kaçınmak için genellikle harici olarak eşitlemeniz gerekir. Performans, orijinal setin performansı gibi olacaktır (ancak bazı senkronizasyon yükleri ve eşzamanlı olarak kullanılırsa engelleme ile).
Yalnızca düşük eşzamanlılığınız varsa ve tüm değişikliklerin diğer iş parçacıkları tarafından hemen görülebildiğinden emin olmak istiyorsanız bunu kullanın.
3) en temel işlemler O (log n) ile ConcurrentSkipListSet
eşzamanlı bir SortedSet
uygulamadır. Yinelemenin, yineleyici oluşturulduğundan bu yana değişiklikler hakkında bilgi verebileceği veya vermeyebileceği eşzamanlı ekleme / çıkarma ve okuma / yineleme sağlar. Toplu işlemler, atomik olarak değil, birden çok tekli çağrıdır - diğer iş parçacıkları sadece bazılarını gözlemleyebilir.
Açıkçası bunu sadece öğelerinizde toplam siparişiniz varsa kullanabilirsiniz. Bu, yüksek eşzamanlı olmayan durumlar için, çok büyük olmayan kümeler için (O (log n) nedeniyle) ideal bir aday gibi görünüyor.
4) ConcurrentHashMap
(ve bundan türetilen Set) için: Burada hashCode()
, HashMap / için olduğu gibi, en temel seçenekler (ortalama olarak, iyi ve hızlı bir şekilde sahipseniz ) (ancak O (n) 'ye dejenere olabilir) HashSet. Yazma için sınırlı bir eşzamanlılık vardır (tablo bölümlendirilmiştir ve yazma erişimi gerekli bölümde senkronize edilecektir), okuma erişimi ise kendisiyle ve yazma iş parçacıklarıyla tamamen eşzamanlıdır (ancak şu anda yapılan değişikliklerin sonuçlarını henüz göremeyebilir) yazılı). Yineleyici, oluşturulduğundan beri değişiklikleri görebilir veya görmeyebilir ve toplu işlemler atomik değildir. Yeniden boyutlandırma yavaştır (HashMap / HashSet için olduğu gibi), bu nedenle oluşturmada gerekli boyutu tahmin ederek (ve 3/4 dolu olduğunda yeniden boyutlandırıldığı için bunun yaklaşık 1 / 3'ünü kullanarak) bundan kaçınmaya çalışın.
Büyük setleriniz, iyi (ve hızlı) bir karma fonksiyonunuz varsa ve haritayı oluşturmadan önce set boyutunu ve gerekli eşzamanlılığı tahmin edebildiğinizde bunu kullanın.
5) Burada kullanılabilecek başka eşzamanlı harita uygulamaları var mı?