- 同步容器的并发问题
1.复合操作
Vector是原子操作 ,但是当有复合操作的时候也会有并发问题。
2.迭代操作
this.list = Collections.synchronizedList(list);
this.list = new CopyOnWriteArrayList<>(list);
这两种都提供了原子操作,但是迭代器没有实现,必须在同步环境中使用
把list对象加上锁。
不希望给容器加锁的话,另一种替代方法是克隆容器,不知道怎么实现。
@Test
public void test01(){
List<Integer> s = new ArrayList<>();
for (int i = 0; i < 100; i++) {
s.add(i);
}
ConModificationRunnable runnable = new ConModificationRunnable(s);
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
Thread t3 = new Thread(runnable);
Thread t4 = new Thread(runnable);
t1.start();
t2.start();
t3.start();
t4.start();
}
public class ConModificationRunnable implements Runnable{
//本地变量, 共享变量 可见性 原子性
private List<Integer> list;
public ConModificationRunnable(List<Integer> list){
// this.list = Collections.synchronizedList(list);
this.list = new CopyOnWriteArrayList<>(list);
}
@Override
public void run() {
synchronized(list){
for(Integer s : list){
System.out.print(s+" ");
}
}
}
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。