可见性就是当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。java内存模型在变量修改后将新的变量值同步回主内存,在其他线程读取该变量之前从主内存刷新变量值来实现可见性。
主要实现可见性的方式有三种:
- volatile,注意一点 volatile不能保证操作的原子性。
- synchronized,synchronized互斥锁对应的内存间交互操作为lock和unlock。在对一个变量进行unlock操作之前,必须把变量值同步回主内存。
- final,被final关键字修饰的变量在构造器中一旦初始化完成,并且没有发生 this 逃逸(其他线程通过this引用访问到初始化了一半的对象),那么其他线程就能看见final字段的值。