【发布时间】:2015-04-16 02:04:29
【问题描述】:
迭代List 是非常不安全的,它正在由另一个线程执行添加/删除 操作。
这就是为什么我们需要CopyOnWriteArrayList
public static void main(String[] args) throws InterruptedException {
List<String> list = new ArrayList<>();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
// java.util.ConcurrentModificationException
for (String s : list) {
System.out.println(s);
}
}
}
});
thread.start();
for (int i=0; i<1000; i++) {
list.add("string" + i);
}
Thread.sleep(Long.MAX_VALUE);
}
但是,设置操作怎么样。目前,以下代码没有抛出任何异常。
public static void main(String[] args) throws InterruptedException {
List<String> list = new ArrayList<>();
list.add("dummy");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
for (String s : list) {
System.out.println(s);
}
}
}
});
thread.start();
for (int i=0; i<1000; i++) {
list.set(0, "smart");
}
Thread.sleep(Long.MAX_VALUE);
}
即使没有任何意外的结果,我想知道,如果线程只对List执行set操作,我们不使用任何锁定是否是一个好习惯机制,还是copy n write机制?
【问题讨论】:
标签: java multithreading