Java volatile作用
大家好,又见面了,我是你们的朋友全栈君。
1、一个变量声明为volatile,就意味着这个变量被修改后其他所有使用到此变量的线程都立即可见
2、禁止指令重排序,防止在运行时不是按照代码的先后顺序执行
volatile是一种轻量级的同步机制,不会引起的线程上下文切换,可以保证可见性和禁止重排序,但不能保证原子性带来的线程安全问题。
volatile特性
可见性 当有多个线程访问同一个变量时,一个线程对此变量的修改,其他线程应该立刻可获取到修改后的值。 一个变量用volatile修饰后,当对此变量写入时,会立刻将写入后的值刷新到主存中,并且将其他线程本地内存中保存的值失效,其他线程读取此变量时,会直接从主内存中读取。
public class VolatileDemo {
private static boolean stop = true;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
while(stop){//无限循环
}
}).start();
//确保上面线程先执行
Thread.sleep(100);
//虽然修改为false,但是上面线程依旧不会停
stop = false;
System.out.println("main thread end...");
}
}
这就是可见性问题,只需要加上volatile修饰符即可。【亲测,确实是!】
private volatile static boolean stop = true;
指令重排序 编译器有时会为了效率,在保证不影响最终结果的前提下,会改变代码的执行顺序。 在单线程下,不会存在问题,但是在多线程下就会带来一些问题,比如单例模式中,双重锁校验,锁的对象必须用volatile修改。
单例模式:双重锁校验
public class DoubleCheck {
private static volatile DoubleCheck doubleCheck = null;
private DoubleCheck() {
}
public static DoubleCheck getInstance() {
//第一次校验
if (doubleCheck == null) {
synchronized (DoubleCheck.class) {
//第二次校验
if (doubleCheck == null) {
doubleCheck = new DoubleCheck();
}
}
}
return doubleCheck;
}
}
doubleCheck = new DoubleCheck();可以分解为3行伪代码 1、memory = allocate() //分配内存 2、ctorInstanc(memory) //初始化对象 3、doubleCheck = memory //设置doubleCheck指向刚分配的地址
转自:https://blog.csdn.net/CSDN_WYL2016/article/details/107006025
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161271.html原文链接:https://javaforall.cn
相关文章
- java.util.Map——Map集合的常用方法「建议收藏」
- java 怎样卸载一个类_Java 动态卸载类[通俗易懂]
- volatile关键字作用与内存可见性、指令重排序概述[JAVA]「建议收藏」
- java中volatile的作用_java中volatile关键字的作用与用法,讲的很透彻
- 浅析Java中volatile关键字及其作用
- java分布式框架_5个强大的Java分布式缓存框架推荐
- Java:详解Java中的异常(Error与Exception)[通俗易懂]
- java常量有哪些_Java中的常量有哪些?
- java中static关键字的作用_Java:Java中static关键字作用
- java有什么作用_Java有什么用「建议收藏」
- MySQL字段类型如何转为java_Java JDBC中,MySQL字段类型到JAVA类型的转换
- java平均的随机数_Java 随机数详解「建议收藏」
- java 框架_java三大主流框架是什么[通俗易懂]
- java常量池在方法区还是堆_JAVA常量池
- java图片合并以及拼接
- java——继承遇到构造方法
- Java设计模式之命令模式
- Java多线程文件下载管理器详解编程语言
- Java程序员必备知识,《JAVA编程思想》包和访问权限详解编程语言
- 标题:Linux下发布Java:开创新纪元(linux发布java)
- Eclipse中把Java工程修改成web工程详解编程语言
- JAVA连接SAP详解编程语言
- Java高效操作MySQL数据库(java写入mysql)
- 处理Java处理Redis中的过期数据(redisjava过期)
- 时间解决Java中Redis数据过期时间问题(redisjava过期)
- 安装Oracle JDK 从Java进入下一个级别(oracle下载java)
- 深入解析Java中volatile关键字的作用
- java根据url抓取并生成缩略图的示例