发现了一个奇怪的问题,大神求解?

是这样的,今天看看了看Java并发包的CountDownLatch类,线程递减锁,然后直接模拟了一下这个类,贴代码

任务类

 public class Task implements Runnable{

    public String name;
    public CountDown countDown;

    public Task(String name,CountDown countDown) {
        this.name = name;
        this.countDown = countDown;
    }
    @Override
    public void run() {
        try {
            System.out.println(name + "start task");
            Long time = new Random().nextInt(10)*1000L;
            Thread.sleep(time);
            System.out.println(name + "end the task" + "spend" + time/1000+"秒");
            countDown.count();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

这个是模拟的CountDownLatch类 核心逻辑可能不一样,我是按照我的想法去写的


public class CountDown {
    public int index ;
    public CountDown(int index) {
        this.index = index;
    }
    public void count(){
        index = index-1;
        System.out.println(index);
    }
    public void await(){


        while(true){
                //System.out.print("");

            /*synchronized (CountDown.class) {
            }*/
                if (index==0) {
                    break;
                }   
        }
    }

}

主方法类


public class Test {
    public static void main(String[] args) {
        CountDown countDown = new CountDown(4);

        Task task1 = new Task("11111", countDown);
        Task task2 = new Task("22222", countDown);
        Task task3 = new Task("33333", countDown);
        Task task4 = new Task("44444", countDown);

        System.out.println("开始任务");

        new Thread(task1).start();
        new Thread(task2).start();
        new Thread(task3).start();
        new Thread(task4).start();

        countDown.await();

        System.out.println("大家都完成任务了吧~");
    }
}

好,问题是CountDown类的await方法中死循环到条件是不会跳出的,但是在死循环里加上一句毫无意义的System.out.print(""); 程序就能正常执行,加上同步代码块也是可以的~ 为什么?大神求解

http://www.itzhai.com/the-introduction-and-use-of-a-countdownlatch.html

count方法是不是的synchronized?

知道问题了 ,CountDown 的index 的应该用volatile 修饰符修饰,死循环中每次就能拿到主内存的数据 而不是工作内存,两年多之前还是幼稚,呵呵