Ben put(K,V)
arayarak içine K-V çiftini koyacağız bir HashMap
private Map<K, V> map = new HashMap<>();
Bir yöntemi var.
diğer yöntem, değerleri rastgele elementlerden oluşan bir dizi elde etmek için ister:
int size = map.size(); // size > 0
V[] value_array = map.values().toArray(new V[size]);
Random rand = new Random();
int start = rand.nextInt(size); int end = rand.nextInt(size);
// return value_array[start .. end - 1]
iki yöntem, iki farklı eşzamanlı iplikleri olarak adlandırılır. Hata
:
Bir ConcurrentModificationException
hata var:
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$ValueIterator.next(Unknown Source)
at java.util.AbstractCollection.toArray(Unknown Source)
Biri dizisindeki toArray()
yöntem aslında HashMap ve diğer dizisindeki bir put()
modifikasyon yineleme gibi görünüyor oluşur.
Question: How to avoid "ConcurrentModificationException" while using HashMap.values().toArray() and HashMap.put() in concurrent threads?
Directly avoiding usingvalues().toArray()
in the second method is also OK.
bir senkronize bloğunda 'map' erişen kodu yürütün: onu her yerde uygularsanız (' senkronize (harita) {...} ' – Titus
' senkronize (harita) {..} 'çalışması gerekir). Collections.synchronizedMap işe yaramaz. http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#synchronizedMap%28java.util.Map%29 adresine bakın. – Thilo