我们不仅希望防止某个线程正在使用对象状态而其他的线程正在修改该状态,而且希望当一个线程修改了对象状态后,其他的线程能够看到发生的状态变化。
可见性:当读操作和写操作在不同的线程中进行时,他们的动作是共享可见的。为了确保多个线程之间对内存写入的操作是可见的,必须采用同步机制。
最低安全性:线程在没有同步机制的情况下,至少获得上一个有效值,而不是获得一个随机值。
Volatile变量:我们可以采用加锁来实现线程同步,但是Java也提供了一种稍弱的同步机制,Volatile变量,用来确保变量的更新操作通知到其他的线程。当我们把某个变量声明为Volatile变量后,编译器和运行时都会注意到这个变量是共享的,因此不会讲Volatile变量缓存在寄存器或者其他处理器不能看到的地方,因此我们对Volatile变量的读入总会是最新写入的值。采用Volatile变量可以有效的确保某个线程读不到变量的最新值。
线程封闭:当访问共享的可变数据时,通常需要使用同步,一种避免使用同步的方式就是不共享数据。如果仅仅在单线程内访问数据,那么就不需要同步,这种就是线程封闭。
栈封闭:在栈封闭中,只能通过局部变量才能访问对象。