美文网首页
同步容器的并发问题

同步容器的并发问题

作者: KeDaiBiaO1 | 来源:发表于2017-11-13 11:27 被阅读0次
  1. 同步容器的并发问题
    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