volatile:

  相当于轻量级的synchronized,因为不存在线程上下文切换这种消耗很大的操作,volatile的读写都是无锁的操作,但是应用范围相对较少,volatile一般用来修饰变量。

volatile不能保证原子性:

  在之前的博客有说到,通过Atomic相关类、synchronized、lock等都能够实现原子性,也就是共享变量的访问互斥,但是volatile无法保证原子性。volatile符合happens-before原则,所以具有可见性和有序性。

volatile保证可见性: 

  1、通过加入内存屏障来实现

  2、对volatile变量进行读写操作,都会通过store、load来强制从主存中读取最新的值,或将数据强制刷新到主存中。

volatile保证有序性:

  通过禁止指令重排保证有序性。

volatile使用场景:

  1.不适合计数场景:因为无法保证原子性。

  3.适合作为状态标示量:例如多线程下作为boolean类型的flag,但是必须只是单纯被多个线程赋值,不能包含其他的操作,如flag = true;如果依赖之前的结果,这样同样不是线程安全,如flag = !flag。

  3.作为触发器:volatile修饰的变量放在后面,之前的所有操作都是具有可见性的,然后变量作为条件判断,实现触发器的作用。

  4.doubleCheck:

单例doubleCheck实现:

public class SingletonExample {

    // 私有构造函数
private SingletonExample() { }
   //分配内存一共有三步
// 1、memory = allocate() 分配对象的内存空间
// 2、ctorInstance() 初始化对象
// 3、instance = memory 设置instance指向刚分配的内存 // 单例对象 volatile + 双重检测机制 -> 禁止指令重排
private volatile static SingletonExample instance = null; // 静态的工厂方法
public static SingletonExample getInstance() {
if (instance == null) { // 双重检测机制
synchronized (SingletonExample.class) { // 同步锁
if (instance == null) {
instance = new SingletonExample();
}
}
}
return instance;
}
}

并发和多线程(七)--volatile的更多相关文章

  1. 并发和多线程-八面玲珑的synchronized

    上篇<并发和多线程-说说面试常考平时少用的volatile>主要介绍的是volatile的可见性.原子性等特性,同时也通过一些实例简单与synchronized做了对比. 相比较volat ...

  2. Java并发和多线程:序

      近期,和不少公司的"大牛"聊了聊,当中非常多是关于"并发和多线程"."系统架构"."分布式"等方面内容的.不少问题, ...

  3. Java并发编程之三:volatile关键字解析 转载

    目录: <Java并发编程之三:volatile关键字解析 转载> <Synchronized之一:基本使用>   volatile这个关键字可能很多朋友都听说过,或许也都用过 ...

  4. python并发编程&多线程(二)

    前导理论知识见:python并发编程&多线程(一) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 官网链 ...

  5. python并发编程&多线程(一)

    本篇理论居多,实际操作见:  python并发编程&多线程(二) 一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一 ...

  6. Java并发编程知识点总结Volatile、Synchronized、Lock实现原理

    Volatile关键字及其实现原理 在多线程并发编程中,Volatile可以理解为轻量级的Synchronized,用volatile关键字声明的变量,叫做共享变量,其保证了变量的“可见性”以及“有序 ...

  7. 7.并发编程--多线程通信-wait-notify

    并发编程--多线程通信-wait-notify 多线程通信:线程通信的目的是为了能够让线程之间相互发送信号; 1. 多线程通信: 线程通信的目的是为了能够让线程之间相互发送信号.另外,线程通信还能够使 ...

  8. Java并发与多线程与锁优化

    前言 目前CPU的运算速度已经达到了百亿次每秒,所以为了提高生产率和高效地完成任务,基本上都采用多线程和并发的运作方式. 并发(Concurrency):是指在某个时间段内,多任务交替处理的能力.CP ...

  9. 并发和多线程(二)--启动和中断线程(Interrupt)的正确姿势

    启动线程: 从一个最基本的面试题开始,启动线程到底是start()还是run()? Runnable runnable = () -> System.out.println(Thread.cur ...

随机推荐

  1. Hadoop之——HBASE结合MapReduce批量导入数据

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46463889 废话不多说.直接上代码,你懂得 package hbase; imp ...

  2. 有时候当你改动了xib &#160; 你调试,各种改的时候又没变化的时候

    当你xib 改变了   调试的时候又没变化的时候,当你各种改错无用的时候,就是xcode xib的缓存问题了.  please clear xcode . command + shift + K . ...

  3. BZOJ 1055 区间DP

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1144  Solved: 668[Submit][Statu ...

  4. YTU 2507: 李白打酒

    2507: 李白打酒 时间限制: 1 Sec  内存限制: 128 MB 提交: 414  解决: 186 题目描述 话说大诗人李白,一生好饮.幸好他从不开车.  一天,他提着酒壶,从家里出来,酒壶中 ...

  5. luogu 3953 逛公园

    noip2017 D1T3 逛公园 某zz选手看到数据范围直接就最短路计数了,结果写错了爆零 题目大意: N个点M条边构成的有向图,且没有自环和重边.其中1号点是起点,N号点是公园的终点,每条边有一个 ...

  6. Oracle高水位线

    Oracle高水位线 https://blog.csdn.net/jx_jy/article/details/50607790 Oracle高水位线的概念 Oracle里面的对象放到存储级别都称为se ...

  7. go语言---defer

    go语言---defer https://blog.csdn.net/cyk2396/article/details/78885135 defer 是在函数退出前调用,多个defer遵循 先进后出 的 ...

  8. android View页面布局总结 最全总结(转)

    下面是我在工作中总结的内容,希望对大家有帮助. 一.布局 View的几种布局显示方式有下面几种:线性布局(LinearLayout).相对布局(RelativeLayout).表格布局(TableLa ...

  9. DNS中的AC、rndc、智能DNS解析和基础排错

    bind中的ACL和rndc DNS除了服务器外,还具有一些访问控制和视图功能. 访问控制是指仅对定义的网络进行解析,视图也就是智能解析. 1>访问控制是通过acl函数来实现的,acl把一个或多 ...

  10. 大神给你分析HTTPS和HTTP的区别(转)

    http://www.php100.com/html/it/biancheng/2015/0209/8582.html 今天在做雅虎的时候,发现用第三方工具截取不到客户端与服务端的通讯,以前重来没碰到 ...