ConcurrentHashMap javadocは、
それらは ConcurrentModificationException をスローしません。ただし、反復子は、一度に 1 つのスレッドだけが使用できるように設計されています。
ただし、以下のコード出力結果では、2 つのスレッドがイテレーターで同時に実行できるようになっています。
ConcurrentHashMap<String,Boolean> ref = new ConcurrentHashMap<String,Boolean>();
new Thread("Insertion"){
public void run(){
for(int i = 0; i < 100; i++){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
ref.put(""+i,Boolean.TRUE);
}
}
}.start();
new Thread("Iterator_1"){
public void run(){
Iterator itr = ref.keySet().iterator();
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
}
while(itr.hasNext()){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread()+"" + itr.next());
}
}
}.start();
new Thread("Iterator_2"){
public void run(){
Iterator itr = ref.keySet().iterator();
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
}
while(itr.hasNext()){
try {
Thread.sleep(20);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread()+"" + itr.next());
}
}
}.start();
出力は、両方の反復子が連携していることを示しています。この javadoc ステートメントを理解するのを手伝ってください。
Thread[Iterator_1,5,main]67
Thread[Iterator_2,5,main]81
Thread[Iterator_1,5,main]2
Thread[Iterator_2,5,main]59
Thread[Iterator_1,5,main]81
Thread[Iterator_2,5,main]40