博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并发和多线程(七)--volatile
阅读量:4311 次
发布时间:2019-06-06

本文共 1233 字,大约阅读时间需要 4 分钟。

volatile:

  相当于轻量级的synchronized,只能用来修饰变量,线程安全的三个特性通过volatile能实现其中的两个

原子性:

  在之前的文章有说到,通过Atomic相关类、synchronized、lock都能够实现原子性,也就是共享变量的访问互斥。但是volatile无法保证

可见性: 

导致共享变量在线程间不可见的原因:

  1、线程交叉执行
  2、重排序结合线程交叉执行
  3、共享变量的值没有在工作内存和主存之间及时更新

如何实现可见性:

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

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

有序性:

   只要满足happens-before原则,就能保证先天的有序性,否则就可能发生指令重排序

synchronized和volatile实现有序性的区别:

   1volatile:关键字会禁止指令重排

  2、synchronized:保证同一时刻只允许一条线程操作。

使用场景:

  1、不适合计数场景,因此无法保证原子性

  2、适合作为状态标示量,多线程下作为flag

  3、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;    }}

转载于:https://www.cnblogs.com/huigelaile/p/10855034.html

你可能感兴趣的文章
11.5
查看>>
JAVA类加载器一 父类委托机制
查看>>
__new__和__init__的区别
查看>>
promise
查看>>
C++11并发——多线程lock_gurad ,unique_lock (三)
查看>>
VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)
查看>>
About me
查看>>
gdbserver 移植与多线程调试
查看>>
乘法表
查看>>
非专业码农 JAVA学习笔记 用户图形界面设计与实现-所有控件的监听事件
查看>>
获取用户ip接口
查看>>
Django部署
查看>>
我与小娜(02):乘坐超速高铁,穿越时空60年
查看>>
H5取经之路——添加hover实现特定效果
查看>>
ultraiso:usb-hdd+ v2
查看>>
WINDOWS symbols
查看>>
SQL Server 2008 镜像的监控 - Joe.TJ -
查看>>
SQL Server DBA 文章:116篇 --DBA_Huangzj
查看>>
数据库Mysql性能优化
查看>>
程序猿是如何解决SQLServer占CPU100%的--马非码
查看>>