9

remove() yöntemini kullanıyorum tamam mı? Senkronizasyonun kaldırılma yöntemine eklenmediği bir makale okudum. Bir ConcurrentHashMap'ten bir spesifik öğesini nasıl düzgün şekilde kaldırırım?Java ConcurrentHashMap'ten Özel Öğeleri Kaldır

Örnek Kod:

ConcurrentHashMap<String,Integer> storage = new ConcurrentHashMap<String,Integer>(); 
    storage.put("First", 1); 
    storage.put("Second", 2); 
    storage.put("Third",3); 


    //Is this the proper way of removing a specific item from a tread-safe collection? 
    storage.remove("First"); 

    for (Entry<String, Integer> entry : storage.entrySet()) { 
     String key = entry.getKey(); 
     Object value = entry.getValue(); 
     // ... 
     System.out.println(key + " " + value); 
    } 
+0

"Ben o senkronizasyon kaldır yöntemine eklenmemiş bir makale okudum" Was Java 5,6,7 veya 8 zamanları hakkında yazılmış bu makale? Belki de aklında eski bir Java sürümü ile yazılmıştır. –

+0

Hopfully bu bağlantı, http://javarevisited.blogspot.ca/2013/02/concurrenthashmap-in-java-example-tutorial-working.html çalışır. "Put(), remove(), putAll() veya clear() gibi güncelleme işlemleri senkronize edilmediğinden beri) Daha fazla bilgi için: http://javarevisited.blogspot.com/2013/02/concurrenthashmap-in-java- example-tutorial-working.html # ixzz3OM79B2ol " –

+0

@ peter.petrov - Kod örneğimde yaptığım gibi bir ConcurrentHashMap'teki kaldırma yönteminin çağrılması tamam mı, doğru mu? iş parçacığı güvenliği bir sorun olmamalı? –

cevap

1

remove yöntem kilidi senkronize yok.

public V remove(Object key) { 
    int hash = hash(key.hashCode()); 
    return segmentFor(hash).remove(key, hash, null); 
} 

ConcurrentHashMap.Segment#remove(key, hash, null) olarak tanımlanır:

V remove(Object key, int hash, Object value) { 
    lock(); 
    try { 
     ... 

Not Javadoc açıklaması:

Aslında ConcurrentHashMap#remove() kodunu kontrol kilit edinme bir lock yönteme yapılan bir çağrı olduğu

Alım işlemleri (get dahil) genellikle engellenmez, bu nedenle güncelleme işlemleriyle örtüşebilir (dahil)ve remove). Retrievals, en son başlatılan 'un tamamlanmış güncelleme işlemlerinin sonuçlarını yansıtmaktadır. putAll ve clear gibi toplu işlemler için, eşzamanlı geri alımlar yalnızca bazı girdilerin eklenmesi veya kaldırılmasını yansıtabilir. Benzer şekilde, Yineleyiciler ve Numaralandırmalar, yineleyici/numaralandırma oluşturulduğunda veya bu noktada bir noktada hash tablosunun durumunu yansıtan öğeleri döndürür. ConcurrentModificationException ürününü atmazlar. Ancak, yineleyiciler bir seferde yalnızca bir iş parçacığı tarafından kullanılmak üzere tasarlanmıştır.

+0

Kod örneğimde kullandığım kaldırma yöntemi tamam, değil mi? İplik güvenliği konusunda endişelenmem gerekmiyor mu? –

+1

Evet, sorun değil. Kullanmak için kilitleme gerekmediğinden ve "ConcurrentModificationException" gerçekleşmeyeceğinden, iplik güvenlidir. – manouti

+0

@ manouti- Teşekkür ederim, ben bilgi aldım makaleyi bağladım. O zaman yazarın yanlış olduğunu düşünüyorum. –

0

bir Iterator işi yapmalıdır:

Iterator<Map.Entry<String, Integer>> iterator = storage.entrySet().iterator(); 
while(iterator.hasNext()) 
{ 
    Map.Entry<String, Integer> entry = iterator.next(); 
    if(entry.getKey().equals("First")) 
    { 
     iterator.remove(); 
    } 
} 

Referans: https://dzone.com/articles/removing-entries-hashmap