谈谈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的 ...
随机推荐
- RHSA-2017:3075-重要: wget 安全更新(代码执行)
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 修复命令: 使用root账号登陆She ...
- mycat 1.6实现读写分离
使用mysql的root账号执行mysql>grant all privileges on *.* to mycatuser@% identified by '123456';mysql> ...
- 6.Android-五大布局
Android 五大布局如下所示: LinearLayout 线性布局 只能指定一个方向(垂直/水平)来布局 RelativeLayout 相对布局 通过某个控件为参照物,来定位其它控件的位置的布局方 ...
- S3C2440 LCD驱动(FrameBuffer)实例开发<二>(转)
开发板自带的LCD驱动是基于platform总线写的,所以如果要使其它的LCD能够在自己的开发板上跑起来,那么就先了解platform驱动的架构,下面简单记录下自己看platform驱动时体会,简单的 ...
- MeteoInfo脚本示例:GrADS to netCDF
这里给出一个将GrADS数据文件转为netCDF数据文件的脚本示例程序,其它格式数据转netCDF可以参考: #-------------------------------------------- ...
- k8s集群添加新得node节点
服务端操作: 方法一: 获取master的join token kubeadm token create --print-join-command 重新加入节点 kubeadm join 192.16 ...
- 第一期chrome浏览器的小技巧------《提高搜索效率》
!!! 这次的技巧是:利用chrome提供的设置 提高你的搜索效率 !!! 我们经常遇到问题,搜索的时候很不方便 比如你在百度上搜索一个东西的时候正好没有搜到,那么你想找到这个东西的话,很明显要到其他 ...
- kinaba 安装踩坑: FATAL Error: [elasticsearch.url]: definition for this key is missing 转
安装 https://www.jianshu.com/p/875457cb8da6 操作系统:Linux kibana 版本: 7.4.0 1. 在/etc/yum.repos.d/ 下新建 ...
- 华为路由器配置OSPF
OSPF是什么 OSPF(Open Shortest Pass First,开放最短路径优先协议),是一个最常用的内部网管协议,是一个链路状态协议. 使用场景:适用于运营商.政府机构等大型网络中多节点 ...
- 基于gin的golang web开发:路由
Gin是一个用Golang编写的HTTP网络框架.它的特点是类似于Martini的API,性能更好.在golang web开发领域是一个非常热门的web框架. 启动一个Gin web服务器 使用下面的 ...