同步容器的并发问题

2017-11-13  本文已影响0人  KeDaiBiaO1
  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+"  ");
                }
            }
        }
        
    }
上一篇 下一篇

猜你喜欢

热点阅读