SORU
20 EYLÜL 2010, PAZARTESİ


Kullanmak için en iyi uygulama'In ConcurrentMap putİfAbsent

Birden çok iş parçacığı tarafından kullanılan bir harita için Java ConcurrentMap kullanıyorum. Bu putİfAbsent harika bir yöntem ve çok standart harita ile işlemler daha okuma/yazma için daha kolaydır. Bu gibi bazı kod var:

ConcurrentMap<String, Set<X>> map = new ConcurrentHashMap<String, Set<X>>();

// ...

map.putIfAbsent(name, new HashSet<X>());
map.get(name).add(Y);

Okunabilirlik akıllı, çok güzel, ama eğer zaten haritada yerini bile yeni bir HashSet her zaman yaratmak gerekiyor. Bu yazabilirsiniz:

if (!map.containsKey(name)) {
    map.putIfAbsent(name, new HashSet<X>());
}
map.get(name).add(Y);

Bu değişiklik ile okunabilirlik biraz kaybeder ama HashSet her zaman oluşturmak için gerekli değildir. Bu durumda daha mı iyi? Daha okunaklı olduğu için ilk kişi ile yan eğilimindedir. İkinci daha iyi performans ve daha doğru olabilir. Belki de bu ya da daha iyi bir yolu yoktur.

Bu şekilde bir putİfAbsent kullanmak için en iyi uygulama nedir?

CEVAP
20 EYLÜL 2010, PAZARTESİ


Eşzamanlılık zor. Eğer eş zamanlı haritalar uğraşmak yerine basit kilitleme kullanacaksanız, bunun için gidebilirim. Nitekim, aramaları gereğinden fazla yapma.

Set<X> set = map.get(name);
if (set == null) {
    final Set<X> value = new HashSet<X>();
    set = map.putIfAbsent(name, value);
    if (set == null) {
        set = value;
    }
}

(Her zamanki stackoverflow Yasal Uyarı: benim kafam karisti. Test değil. Derlenmiş değil. Vb.)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • julioissk84life

    julioissk84l

    18 ŞUBAT 2008
  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009
  • Samvith V Rao

    Samvith V Ra

    20 EKİM 2006