volatile的作用
1.改变线程间的变量可见性
每个线程都有一个专用的工作集内存,下图里面粉色的表示专用工作集内存,黄色的是共享内存工作区,如果加入了volatile,那么t1也会去查看黄色的共享内存工作区,以及时查看volatile变量的变化,这就是改变了“线程间的变量可见性”!
i修改之前:(不管有没有volatile的情况)
i
没有volatile并且修改之后:
i
有volatile并且修改之后:
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class Main {
// volatile int i = 1;
int i = 1;
void task1() {
System.out.println("开始");
while (i == 1){
}
System.out.println("结束");
}
public static void main(String[] args) {
Main main = new Main();
new Thread(main::task1).start();
try {
TimeUnit.SECONDS.sleep(2 );
} catch (Exception e) {
e.printStackTrace();
}
main.i = 2;
}
}
如何针对“线程不可见性”进行解决问题?
加入volatile修饰即可!
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
public class Main {
volatile int i = 1;
// int i = 1;
void task1() {
System.out.println("开始");
while (i == 1){
}
System.out.println("结束");
}
public static void main(String[] args) {
Main main = new Main();
new Thread(main::task1).start();
try {
TimeUnit.SECONDS.sleep(2 );
} catch (Exception e) {
e.printStackTrace();
}
main.i = 2;
}
}
2.禁止指令重排序
这里不细说展开,直接给黑马学习视频链接,他讲解的十分清晰!!!看多几遍就好了!!!
【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】 https://www.bilibili.com/video/BV1yT411H7YK/?p=99&share_source=copy_web&vd_source=afbacdc02063c57e7a2ef256a4db9d2a
参考的学习视频
【【java并发】5分钟快速了解volatile关键字,上岸大厂有保证。】 https://www.bilibili.com/video/BV1WC4y1y7na/?share_source=copy_web&vd_source=afbacdc02063c57e7a2ef256a4db9d2a
2.
【新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题)】 https://www.bilibili.com/video/BV1yT411H7YK/?p=99&share_source=copy_web&vd_source=afbacdc02063c57e7a2ef256a4db9d2a