对象的共享

可见性

当读操作和写操作在不同线程的时候,读到可能是旧的值。为了确保多线程之间对内存的写入操作的可见性,必须使用同步机制。
当线程在没有同步的情况下读取变量时,可能会得到一个失效的值,但至少这个值是由之前某个线程设置的值,而不是随机值。这种安全性保证也被称为最低安全性。
最低安全性适用于大多数变量,但是存在一个例外:非volatile类型的64位数值变量double和long。Java内存模型要求,变量的读写操作都必须原子操作,但是对于非volatile类型的long和double变量,JVM允许将64位的读写操作分解为两个32位的操作。当读取一个非volatile类型的long变量时,如果对该变量的读写操作在不同线程执行,那么很可能会一个线程刚写入高32位,就被另一个线程读到,那么读线程就读到一个新的高32和旧低32位的值。
加锁的意义不仅仅局限于互斥行为,还包括内存可见性。为了确保所有线程能看到共享变量的最新值,所有执行读写操作的线程都必须在同一个锁上同步。

文章目录
  1. 1. 可见性
|