Java 多线程:volatile 关键字如何保证变量可见性?
在 Java 多线程编程中,如果不加 volatile 关键字,setFlag 方法执行后,checkFlag 方法可能无法立即看到新的 flag 值。这是因为在多线程环境下,每个线程都有自己的本地缓存,当一个线程修改了共享变量的值时,其他线程不一定能够立即看到修改后的值,因为它们可能还在使用自己的本地缓存。
这种情况下,可以使用 synchronized 关键字或者 volatile 关键字来保证共享变量的可见性。
volatile 关键字的作用是:
-
保证可见性: 当一个线程修改了
volatile变量的值后,其他线程能够立即看到修改后的值。这是因为volatile变量会强制将修改后的值写入主内存,并刷新其他线程的本地缓存。 -
禁止指令重排序:
volatile关键字可以防止编译器和处理器对volatile变量的操作进行重排序。
synchronized 关键字则可以保证共享变量的原子性和可见性。
总结:
volatile关键字可以保证共享变量的可见性,但不能保证原子性。synchronized关键字可以保证共享变量的原子性和可见性。
在实际应用中,根据具体需求选择合适的关键字。
原文地址: https://www.cveoy.top/t/topic/mNYL 著作权归作者所有。请勿转载和采集!