import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class MyContainer2 {
    //添加volatile,使t2能够得到通知
    volatile List lists = new ArrayList();
    public void add(Object o) {
        lists.add(o);
    }
    public int size() {
        return lists.size();
    }
    public static void main(String[] args) {
        MyContainer2 c = new MyContainer2();
        new Thread(() -> {
            for(int i=0; i<10; i++) {
                c.add(new Object());
                System.out.println("add " + i);
                //注释掉后t2没有结束??
//                try {
//                    TimeUnit.SECONDS.sleep(1);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
            }
        }, "t1").start();        new Thread(() -> {
            while(true) {
                if(c.size() == 5) {
                    break;
                }
            }
            System.out.println("t2 结束");
        }, "t2").start();
    }
}如果volatile可以保证实时更新,t2现场判断c.size()=5时候应该跳出while循环,输出"t2 结束",可是本程序有时候可以输出"t2 结束",有时候就不输出

解决方案 »

  1.   

    多线程实际执行时需要获取cpu时间片,如果在c长度是5的时候,线程2没获得时间片那就没法结束
      

  2.   

    volatile 只能保证 每次读的都是最新的,但是不能保证符合操作的原子性,即 volatile a; a++,这个a++ 操作不是原子性的。
      

  3.   

    你这个 volatile List ,这样只是标识你的List 是原子性的,但是里面的操作并不是原子性的。可以加锁,或者使用 volatile 类型数组 试试
      

  4.   

    https://blog.csdn.net/qinhaotong/article/details/96302416