1 可见性
当一个线程修改了对象状态后,其他线程能够看到发生的状态修改。
1.1 失效数据
在没有合适的同步机制保证情况下,多线程访问同一对象状态时,线程可能会获取到一个失效值,及失效数据(一般为过期值)。
1.2 非原子的64位操作
java内存模型要求,变量的读取和写入操作都必须是原子操作,但对非volatile类型的long和double变量,jvm运行将64位的读或写操作分解为两个32位操作。
1.3 加锁和可见性
加锁的含义不仅仅局限于互斥行为,还包括内存可见性。
为了确保所有线程都能看到共享的变量的最新值,所有执行读操作或写操作的线程都必须在同一个锁上进行同步。
1.4 volatile变量
volatile变量,用于确保将变量的更新通知到其他线程(只保证可见性,不能保证原子性)。
把变量声明为volatile后,编译器与运行时环境不会将该变量上的操作和其他内存操作进行重排。
volatile变量也不会被缓存在寄存器或对其他处理器不可见的对象,读写都直接操作主存,隐藏在读取变量时总是会返回最新写入的值。
volatile变量是一个比锁更轻量级的同步机制。
正确使用方法:
- 确保自身状态的可见性
- 确保所引用对象状态的可见性
- 标识一些重要的程序生命周期事件的发生。
主要适用于:
- 变量的写入操作不依赖于当前值
- 变量不会和其他变量纳入不变条件中
- 访问变量时不需要加锁