同步的重要性有两个方面:
- 实现原子性:防止某个线程正在使用对象状态而另一个线程同时在修改改状态
- 内存可见性:确保一个线程修改了对象状态后,其他线程能够看到发生的状态变化
失效数据
- 缺乏同步的程序可能会产生的一种错误情况就是——失效数据
- 失效数据举例
//在没有同步的情况下共享数据 public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread { public void run() { while (!ready) Thread.yield(); System.out.println(number); } } public static void main(String[] args) { new ReaderThread().start(); number = 42; ready = true; } }
引发的问题有
- NoVisibility 可能会持续循环下去,因为ReaderThread可能永远看不到ready写入的值
- NoVisibility 可能会输出0,因为ReaderThread可能看到了ready写入的值,但是没有看到写入的number的值(这种现象叫重排序)
非原子的64位操作
- 非vola