Java Volatile关键字可见性问题分析
Java 内容模型
具体可以查看这篇文章Java内存模型,大致就是,在Java多线程工作中,每个线程有自己的工作内存,变量存在主内存,在Java线程读取变量的时候,会优先在自己的工作内存中查找,当工作内存中不存在时,会通过Load操作进行读取变量,当对数据发生修改时会通过Save将变量更新到主内存中,而为了保证内存的可见性,可以通过Volatile关键字修饰变量,通过关键字修饰后的变量,在被一个线程更改后,新的值会对其他的线程立即得知。听起来是那么回事,但是自己理解的时候,用多线程发现有时候好像又不是那回事,好像普通变量也会在一个线程更新值的时候,对别的线程也会进行更新,这个问题目前没有解决还需要,继续了解Save和Load的时机。
普通变量(非Vola变量)的内存不可见性
package LockFuncs;
public class VolatileTest {
boolean isStop = false;
public void test(int i){
Thread t1 = new Thread(){
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
isStop=true;
System.out.println(isStop);
}
};
Thread t2 = new Thread(){
public void run() {
while (!isStop) {
}
}
};
t2.start();
t1.start();
}
public

本文分析了Java中的Volatile关键字如何确保内存可见性。通过实例展示了非Volatile变量在多线程环境中可能存在不可见性问题,而Volatile变量则能确保线程间变量值的即时更新。同时,文章提出了一些关于Volatile原子性的疑问,探讨了可能影响其行为的因素。
最低0.47元/天 解锁文章

24万+

被折叠的 条评论
为什么被折叠?



