HiddenInterator の例を、Java 同時実行の実践書で見つけました。
class ConcurentIterator implements Runnable {
// because of final it is immutable, so it is thread safe
private final Set<Integer> v = new HashSet<Integer>();
//private final Vector<Integer> v = new Vector<Integer>();
public synchronized void add(Integer i) {
v.add(i);
}
public synchronized void remove(Integer i) {
v.remove(i);
}
public void addTenThings() {
Random r = new Random();
for (int i = 0; i < 10; i++) {
add(r.nextInt());
System.out.println("DEBUG: added ten elements to " + v);
}
}
public void run() {
addTenThings();
}
}
私はすべてを理解しています!それはすばらしい!
次の質問があります。
Java では、ConcurentSkipListMap、ConcurrentHashMap などの同時コレクションがあり、問題は修正されています。しかし、問題が発生する可能性のあるクラスはどれですか(修正されていない場所)? たとえば、ベクターで発生する可能性はありますか? 私がテストしていたとき、ベクトルで ConcurentModificationException をスローできませんでした。
試験方法:
public static void main(String[] args) {
Thread[] threadArray = new Thread[200];
ConcurentIterator in = new ConcurentIterator();
for (int i = 0; i < 100; i++) {
threadArray[i] = new Thread(in);
}
for (int i = 0; i < threadArray.length; i++) {
threadArray[i].start();
}
}