同步容器的并发问题
- 同步容器的并发问题
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+" ");
}
}
}
}
本文标题:同步容器的并发问题
本文链接:https://www.haomeiwen.com/subject/ebiamxtx.html
网友评论