编程语言
首页 > 编程语言> > java-使用布尔值进行同步

java-使用布尔值进行同步

作者:互联网

以下代码在并发访问List时是否是线程安全的?
挥发物合格在这里增加任何价值吗?

   class concurrentList{

        private AtomicBoolean locked = new AtomicBoolean(true);
        volatile List<Integer> list=new LinkedList<Integer>();
        long start = System.currentTimeMillis();
        long end = start + 60*100;


        public void push(int e){
            while(!locked.get());
            list.add(e);
            while(!locked.compareAndSet(true,false));
        }

        public int pop(){
            int elem;
            while(locked.get());
            elem=(Integer)list.remove(0);
            while(!locked.compareAndSet(false,true));
            return elem;
        }
....
}

解决方法:

不,它不是线程安全的.调用push()的两个线程可以完美地将lock读取为true,然后同时将其添加到链接列表中.由于LinkedList不是线程安全的,因此您的代码也不是线程安全的.

要锁定,请使用锁,而不是AtomicBoolean.

标签:concurrency,java-util-concurrent,java
来源: https://codeday.me/bug/20191111/2018928.html