zoukankan      html  css  js  c++  java
  • Volatile关键字

    volatile关键字作为面试官最喜欢的问题之一肯定有着他独一无二的作用,我想结合着面试题来帮助我更进一步理解volatile。

    1.volatile如何保证可见性

    我觉得主要是他的内存语义的缘故

    volatile写的内存语义是 更改线程volatile变量,线程会将这个volatile变量刷新会主存。

    volatile读的内存语义是 线程读volatile变量时,线程会将自己缓存中的变量无效,然后从主存中读取变量。

    2.volatile内存语义是如何实现的

    volatile为了限制编译器重排序和处理器重排序在volatile的读和写前后都添加了内存屏障来防止volatile读和写前后的读写指令重排到volatile的后和前。

    3.volatile能保证线程安全么

    volatile是不能保证线程安全的,volatile只是保证了可见性

    例子就是 用volatile修饰一个数字,然后数字执行++ 或者 -- 操作,因为++ 和 -- 都不是原子操作,所以volatile是没法保证线程安全的。

    4.单例模式中的双重检查锁的INSTACNE为什么要用voliate修饰

    首先是双重检查锁

    public class Singlen{
        private Singlen(){
            
        }
        private volatile static Instance instance;
        
        public Instance getInstance(){
            if(instance == null){
                synchronized(Singlen.class){
                    if(instance == null){
    //error                    instance = new Instance();
                    }
                }
            }
            return instance;
        }
        
    } 

     其中代码error中的对象实例化可以分为三个指令

    1.分配内存空间

    2.初始化对象

    3.对象指向内存空间

    但是编译器进行指令重排序的时候可能会将2.3指令进行重排序,虽然不会改变结果,但是当额外线程来判断第一个检查锁的时候就会发现instance不为null,直接返回一个实例化不完全的对象。

    所以使用volatile来封闭这个重排序,让外界的读操作只能在写操作完成之后进行。

    后续继续补充!

  • 相关阅读:
    Ubuntu中的Gif动画录制工具
    NDT(Normal Distributions Transform)算法原理与公式推导
    激光数据匹配(MATLAB Robotics System Toolbox)
    使用正态分布变换(Normal Distributions Transform)进行点云配准
    微软Xbox One无线手柄控制机器人
    SICK LMS111激光雷达的使用
    SICK TiM561激光雷达的使用
    JAVA操作Hbase
    shell date 命令整理
    ArrayList排序
  • 原文地址:https://www.cnblogs.com/frank9571/p/13382718.html
Copyright © 2011-2022 走看看