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

  • Peyton

    Peyton

    28 Aralık 2008
  • PorterRobinsonVEVO

    PorterRobins

    11 Kasım 2013
  • vgeller1

    vgeller1

    22 Kasım 2009