Java concurrent volatile - guguoyi/WorkLine GitHub Wiki

1.为什么要用volatile修饰符? 主要为了解决共享变量在多线程中的内存可见性,volatile阻止了jvm优化,使线程不能保存它的私有拷贝,而应直接与共享成员变量交互。 JVM对成员变量的优化: Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才将私有拷贝与共享内存中的原始值进行比较。

2.volatile的作用 volatile是一种稍弱的同步机制,在访问volatile变量时不会执行加锁操作,也就不会执行线程阻塞,因此volatile变量是一种比synchronized关键字更轻量级的一种同步机制

3.volatile的使用建议 在多线程需要访问的成员变量上使用volatile,当要访问的变量已经在synchronized同步代码块中,或者为常量时,没必要使用volatile.

4.volatile存在的问题 假如有两个线程分别读写volatile变量时,线程A写入了某volatile变量,线程B在读取该volatile变量时,便能看到线程A对该volatile变量的写入操作,关键在这里,它不仅会看到对该volatile变量的写入操作,A线程在写volatile变量之前所有可见的共享变量,在B线程读同一个volatile变量后,都将立即变得对B线程可见。