2010-05-21 9 views
17

Tek bir Karşılaştırıcı örneği oluşturursam, bu örnek koleksiyonları Koleksiyonlar.sort() kullanarak sıralamak için birden fazla iş parçacığı üzerinde kullanılabilir mi? Ya da, iş parçacığı güvenliğini sağlamak için Collections.sort() öğesine yapılan her çağrı için Karşılaştırıcı'nın yeni bir örneğini oluşturmam gerekir mi?Java'da, Collections.sort() thread safe'de kullanılan bir Karşılaştırıcı mı?

cevap

18

Bu, tamamen Comparator'u nasıl uyguladığınıza bağlıdır. Örneğin, karşılaştırma sırasında içeriğe yazılan veya içeriği örtük olarak değiştirilmiş örnek değişkenleri varsa, bunlar threadafe olmaz.

Çoğu Comparator uygulaması böyle bir şey yapmaz, ancak makul bir şekilde gerçekleşebilecek bir senaryo, tarihleri ​​temsil eden Dizeleri karşılaştırmak için SimpleDateFormat kullanıyordur. Ne yazık ki, SimpleDateFormat'un kendisi iş parçacığı güvenli değildir.

5

Karşılaştırıcı bir arabirimdir, iç tutarlı bir eşzamanlılık özelliklerine sahip değildir. Uygulamanız threadafe veya değilse, yazdığınıza bağlıdır. Yaptığı her şey, karşılaştırma yönteminin (Örnek veya Sınıf düzeyi durumu) kapsamı ile sınırlandırılmışsa ve kullandığı tüm kaynaklar threadafe ise, o zaman kendini threadafe olacaktır.

0

Genellikle (her zaman?) Reentrant olduğundan, iş parçacığı olmayan bir Güvenli Karşılaştırıcı bulursam çok şaşırdım.

Sıralı koleksiyon, sıralanan sırada değiştirilmekte olan koleksiyon değiştirilirse olurdu.

+2

İş parçacığı güvenli olmayan karşılaştırma yönteminin içinde bir miktar kaynak kullanıyor olabilir. Eşlenmemiş bir koleksiyon, takvim vb. Düzenleme: Ne Michael B dedi^ – Affe

+1

Haklısın, bu davaları düşünmemiştim. – Artefacto

İlgili konular