同步容器的并发问题

  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+"  ");
                }
            }
        }
        
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 878评论 0 3
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,384评论 11 349
  • 并发与多线程是每个人程序员都头疼的内容,幸好Java库所提供了丰富并发基础模块,这些多线程安全的模块作为并发工具类...
    登高且赋阅读 1,259评论 0 8
  • 对于一个对象来说,我们为了保证它的并发性,通常会选择使用声明式加锁方式交由我们的 Java 虚拟机来完成自动的加锁...
    Single_YAM阅读 450评论 0 1
  • 对于线程安全和并发:线程安全并不一定适合并发(性能还要好),要根据应用场景选用最合适的容器类。 一、历史 JDK1...
    maxwellyue阅读 1,135评论 0 5