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

  • 8lacKy

    8lacKy

    30 Mart 2009
  • campos9896

    campos9896

    24 Mart 2012
  • graham025

    graham025

    25 NİSAN 2006