i = 0; i < 100000; i++) { holder.add(i); for(Integer value : holder.getList()){ System.out.println(value); } } } スレッドで実行されるクラス public class Holder { private List<Integer> list; public synchronized void add(Integer i) { list.add(i); } public List<Integer> getList(){ return list; } } addをスレッドセーフにしたクラス Exception in thread "Thread-1" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at jp.gr.java_conf.tsyki.thread.lecture.ThreadListIteratorSample$Counter.run(ThreadListIteratorSample.java:40) at java.lang.Thread.run(Thread.java:748) 24
• CopyOnWriteArrayListを使うか、ループ前にリストを作り直す private class Itr implements Iterator<E> { int expectedModCount = modCount; public E next() { checkForComodification(); ... } } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } 26
prio=5 os_prio=0 tid=0x000000001f6a6800 nid=0x3ac0 waiting for monitor entry [0x000000002035f000] java.lang.Thread.State: BLOCKED (on object monitor) at jp.gr.java_conf.tsyki.thread.lecture.ThreadDeadLockSample.append(ThreadDeadLockSample.java:64) - waiting to lock <0x000000076b0e0b80> (a java.util.ArrayList) - locked <0x000000076b0e0cf0> (a java.util.ArrayList) at jp.gr.java_conf.tsyki.thread.lecture.ThreadDeadLockSample$SampleThread.run(ThreadDeadLockSample.java:50) "Thread-0" #11 prio=5 os_prio=0 tid=0x000000001f5a0000 nid=0x4e40 waiting for monitor entry [0x000000002025f000] java.lang.Thread.State: BLOCKED (on object monitor) at jp.gr.java_conf.tsyki.thread.lecture.ThreadDeadLockSample.append(ThreadDeadLockSample.java:64) - waiting to lock <0x000000076b0e0cf0> (a java.util.ArrayList) - locked <0x000000076b0e0b80> (a java.util.ArrayList) at jp.gr.java_conf.tsyki.thread.lecture.ThreadDeadLockSample$SampleThread.run(ThreadDeadLockSample.java:50) 33