谈谈volatile
volatile的作用:
volatile关键字的作用包括:保障可见性,保障有序性。
何为保障可见性,看下面的代码:

package com.mashibing.thread.lock;
public class TestVolatile {
    public static void main(String[] args) {
        try {
            Thread8 t = new Thread8();
            t.start();
            Thread.sleep(1000);
            t.setRunning(false);
            System.out.println("已赋值false");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
class Thread8 extends Thread {
    private boolean isRunning = true;
    public boolean isRunning() {
        return isRunning;
    }
    public void setRunning(boolean isRunning) {
        this.isRunning = isRunning;
    }
    public void run() {
        System.out.println("进入run()了");
        while (isRunning) {
        }
        System.out.println("线程被停止了");
    }
}
我们在主线程里面,启动一个线程,然后去修改的isRunning属性,达到中止线程中while循环的目的,但是实际我们运行代码的结果如下:

很明显,线程没有停止。此时我们在isRunning变量加上vo;alite关键字,结果如下:

这就达到了我们的目的了。所以volatile可以保障一个线程修改了共享变量,能够对其他线程保持可见。
何为保障有序性,看下面的代码:

package singleton; /**
* @ClassName SingletonDemo2
* @Description 双重检查(比较完美的写法)
* @Author liuyi
* @Date 2020/6/7 13:23
* @Version 1.0
*/
public class SingletonDemo4 {
//必须加volatile关键字,防止指令重排
private static volatile SingletonDemo4 instance; private SingletonDemo4(){ } public synchronized static SingletonDemo4 getInstance(){
//为什么要进行双重检查
//比如两个线程同时进入该方法,都拿到instance为空,其中一个拿到锁并new了一个实例,
//此时另外一个线程它并不知道你已经new了实例,所以当它拿到锁之后会继续new一个实例
//所以如果在锁里面继续判断一次是很有必须要的
if(instance==null){
synchronized (SingletonDemo4.class){
if(instance==null){
instance = new SingletonDemo4();
}
}
}
return instance;
} public static void main(String[] args) {
for (int i = 0; i <100 ; i++) {
new Thread(()->{
System.out.println(getInstance());
}).start();
}
}
}
这里是一个经典的单例模式实现方式之一,我们用volatile关键字单例对象,这里为什么加volatile关键字,就是为了防止出现指令重排序,保障有序性。
我们来分析这里为什么需要防止出现指令重排序,
synchronized (SingletonDemo4.class){
                if(instance==null){
                    instance = new SingletonDemo4();
                }
            }
我们来看被锁住的这句代码,instance = new SingletonDemo4(),其实这句话在计算机底层是分为几个步骤实现的,那么就会一种情况,instance先被
写入到共享变量,然后再被初始化。因为,计算机底层的执行顺序是可以重新排列的,这种现象被称作为指令重排序。那么刚好这个时候,有其他的线程走到if(instance==null)
就会再次进行初始化,这就破环了单例。当然这种情况,只有在超高的并发下才可能出现,我们自己做测试很难出现。
谈谈volatile的更多相关文章
- 谈谈volatile关键字以及常见的误解
		
转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/9092520.html 近期看到C++标准中对volatile关键字的定义, ...
 - 每日一问:谈谈 volatile 关键字
		
这是 wanAndroid 每日一问中的一道题,下面我们来尝试解答一下. 讲讲并发专题 volatile,synchronize,CAS,happens before, lost wake up 为了 ...
 - 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议
		
引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...
 - volatile可见性的一些认识
		
一.前言 volatile的关键词的使用在JVM内存模型中已是老生常谈了,这篇文章主要结合自己对可见性的一些认识和一些直观的例子来谈谈volatile.文章正文大致分为三部分,首先会介绍一下happe ...
 - volatile可见性的一些认识和论证
		
一.前言 volatile的关键词的使用在JVM内存模型中已是老生常谈了,这篇文章主要结合自己对可见性的一些认识和一些直观的例子来谈谈volatile.文章正文大致分为三部分,首先会介绍一下happe ...
 - 聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路
		
引言 很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做<回答阿里社招面试 ...
 - 顺便谈谈对于Java程序猿学习当中各个阶段的建议
		
引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...
 - JAVA多线程基础学习三:volatile关键字
		
Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字. volatile,从字面上说是易变的.不稳定的,事实上,也确实如此,这个 ...
 - Java程序员面试必备:Volatile全方位解析
		
前言 volatile是Java程序员必备的基础,也是面试官非常喜欢问的一个话题,本文跟大家一起开启vlatile学习之旅,如果有不正确的地方,也麻烦大家指出哈,一起相互学习~ 1.volatile的 ...
 
随机推荐
- java -inally转
			
1.不管有木有出现异常,finally块中代码都会执行: 2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没有返 ...
 - MeteoInfoLab脚本示例:CloudSAT Swath HDF数据
			
读取CloudSAT HDF Swath数据,绘图分上下两部分,上面是时间和高度维的Radar Reflectivity Factor二维图,下面是卫星轨迹图.示例程序: # Add file f = ...
 - 闭嘴,给你一个数!1分钟,学完C语言指针,不扎手只扎心的针!
			
序言 指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎.辨别一个人C语言学的好赖就看他对指针的理解怎么样.指针内容也是工作面试经常问到的问题.本文将带你重新认识那个绊倒你的指针,以解 ...
 - jmeter_02_目录文档说明
			
jmeter目录文档说明 bin目录是可执行文件 jmeter.bat 是启动文件 可以启动jmeter. 使用notpad++ 等文本编辑器打开 bat文件 可以配置jvm的参数 比如堆内存[Hea ...
 - centOS7永久关闭防火墙(防火墙的基本使用(转)
			
查看防火墙状态: systemctl status firewalld.service 如图 绿的running表示防火墙开启 执行关闭命令: systemctl stop firewalld.ser ...
 - Dubbo系列之 (七)网络层那些事(2)
			
辅助链接 Dubbo系列之 (一)SPI扩展 Dubbo系列之 (二)Registry注册中心-注册(1) Dubbo系列之 (三)Registry注册中心-注册(2) Dubbo系列之 (四)服务订 ...
 - Java安全之Commons Collections3分析
			
Java安全之Commons Collections3分析 文章首发:Java安全之Commons Collections3分析 0x00 前言 在学习完成前面的CC1链和CC2链后,其实再来看CC3 ...
 - 12天搞定Python,基础语法(上)
			
不知你是否见过建楼房的过程,没有的话,找个时间去瞧一瞧,看一看.看过之后,你就会明白.建楼房,只有打好地基之后,才能在砌墙,建的楼层越高,打的地基就越深. 学编程也一样,要想得心应手的应用,得先打好地 ...
 - ElasticSearch实战系列九: ELK日志系统介绍和安装
			
前言 本文主要介绍的是ELK日志系统入门和使用教程. ELK介绍 ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件.新增了一 ...
 - 联赛模拟测试22  D. 简单计算
			
题目描述 分析 \(\sum_{i=0}^p[(p|qi)?0:1]=\sum_{i=0}^p[(p/gcd(p,q)|qi/gcd(p,q))?0:1]=\sum_{i=0}^p[(p/gcd(p, ...