Tôi có một HashMap
private Map<K, V> map = new HashMap<>();
Một phương pháp sẽ đưa cặp K-V vào nó bằng cách gọi put(K,V)
.
Phương pháp khác muốn trích xuất một tập hợp các yếu tố ngẫu nhiên từ các giá trị của nó:
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]
Hai phương pháp này được gọi là trong hai đề đồng thời khác nhau.
Lỗi:
tôi nhận được một lỗi ConcurrentModificationException
:
at java.util.HashMap$HashIterator.nextEntry(Unknown Source)
at java.util.HashMap$ValueIterator.next(Unknown Source)
at java.util.AbstractCollection.toArray(Unknown Source)
Dường như toArray()
phương pháp trong một thread thực sự là iterating trên HashMap và put()
sửa đổi trong chủ đề khác xảy ra.
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.
Execute mã mà truy cập vào 'map' trong một khối đồng bộ hóa: 'đồng bộ hóa (bản đồ) {...}' – Titus
' đồng bộ hóa (bản đồ) {..} 'nên làm việc (nếu bạn áp dụng nó ở khắp mọi nơi). Collections.synchronizedMap sẽ không hoạt động. xem http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#synchronizedMap%28java.util.Map%29 – Thilo