Victor是对的,您的代码存在问题:原子性和可见性。
这是我的版本:
private int count; private volatile boolean stop; private volatile boolean stopped; @Override public void run() { while (!stop) { count++; // the work } stopped = true; System.out.println("Count 1 = " + count); } public void stopCounting() { stop = true; while(!stopped); //busy wait; ok in this example } public int getCount() { if (!stopped) { throw new IllegalStateException("not stopped yet."); } return count; }}
如果线程观察到
stopped==true,则可以确保工作完成并且结果可见。
从易失性写入到易失性读取(在同一变量上)之间存在事前关系,因此如果有两个线程
thread 1 thread 2 action A | volatile write volatile read | action B
动作A在动作B之前发生;B中可以看到A中的写入。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)