同步格言:如果你向一个变量写值,而这个变量接下来可能被另一个线程读取,或者你从一个变量读修值,而它的值可能是前面由另一个线程写入的,此时必须使用同步
volatile用于修饰变量,它规定对其修饰变量的访问必须从内存中获取,从而确保变量的同步。
*多处理器的计算机能够暂时在寄存器或本地内存缓冲区中保存内存中的值。这么做的结果就是在不同的处理器上运行的线程可能在同一地址上看到不同的值。
*编译器能够改变指令执行的顺序以使吞吐量最大化。这中顺序上的变化不会改变代码的语义,但编译器假充只有在代码中存在显示的修改指令时,内存中的值才会发生变化。
但是,内存的值可能在另外一个线程被修改。
在下面三个条件下,对一个域的并行访问是安全的:
*域是volatile的
*域是final的,并且在构造器调用完成后访问的
*对域的访问有锁保护的