美文网首页
关于Valotile的理解

关于Valotile的理解

作者: 猴哥一一 | 来源:发表于2018-03-27 07:30 被阅读0次

转自小端有话说

[toc]

请你说下对Valotile的了解,以及使用场景 ?

分析:说到valotile, 我们应该知道它的使用场景是多线程. 对于多线程编程,我们要解决的问题集中在三个方面:

  • a.原子性,最简单的例子就是,i++,在多线程环境下,最终的结果是不确定的,为什么?就是因为这么一个++操作,被编译为指令后,是多个指令来完成的。那么遇到并发的情况,就会导致彼此“覆盖”的情况。
  • b.可见性,通俗解释就是,在A线程对一个变量做了修改,在B线程中,能正确的读取到修改后的结果。究其原理,是cpu不是直接和系统内存通信,而是把变量读取到L1,L2等内部的缓存中,也叫作私有的数据工作栈。修改也是在内部缓存中,但是何时同步到系统内存是不能确定的,有了这个时间差,在并发的时候,就可能会导致,读到的值,不是最新值。
  • c.有序性:这里只说指令重排序,虚拟机在把代码编译为指令后执行,出于优化的目的,在保证结果不变的情况下,可能会调整指令的执行顺序。

valotile,能满足上述的可见性和有序性。但是无法保证原子性
可见性,是在修改后,强制把对变量的修改同步到系统内存。而其他cpu在读取自己的内部缓存中的值的时候,发现是valotile修饰的,会把内部缓存中的值,置为无效,然后从系统内存读取。
有序性,是通过内存屏障来实现的。所谓的内存屏障,可以理解为,在某些指令中,插入屏障指令,用以确保,在向屏障指令后面继续执行的时候,其前面的所有指令已经执行完毕。

既然说valotile 还无法保证线程安全, 那该如何线程安全 ?

这时候就需要同步器比如 synchronized 的介入, 来保证原子性了;
毕竟 原子性 + 可见性 + 有序性 才能保证线程安全

valotile在单例模式中的应用

在写单例模式时,我们通常会采用双层判断的方式,在最内层,instance = new Singleton()。其实这也有一个隐含的问题:这句赋值语句,其实是分三步来操作的:
  a.为instance分配内存
  b.调用Singleto构造函数来初始化变量
  c.instance指向上一步初始化的对象
在jvm做了指令重排序优化后,上述步骤b和c不能保证,可能出现,c先执行,但是对象却没初始化,这时候其他线程判断的时候,发现是非null,但是使用的时候,却没有具体实例,导致报错。

所以,我们可以用valotile来修饰instance,避免该问题。

相关文章

  • 关于Valotile的理解

    转自小端有话说; [toc] 请你说下对Valotile的了解,以及使用场景 ? 分析:说到valotile, 我...

  • JMM与valotile

    参考链接: https://www.cnblogs.com/dolphin0520/p/3920373.html ...

  • 8、线程同步机制(volatile与CAS)

    一、轻量级同步机制:valotile关键字 volatile变量只没有被final修饰的实例或者静态变量称为vol...

  • Java线程可见性——加一句System.out.println

    今天突然想起一个以前有人提到过的问题,大概就是A线程持有一个引用类型b变量(不加valotile或者final),...

  • 获取设备唯一标识

    关于UUID的理解 : 关于UDID的理解 : 以下是苹果对于禁用UDID的声明: 关于IDFV的理解 : 关于I...

  • 关于理解

    "我理解‘’这句三个字很容易是出口,但是你真的做到了吗?听过《刘润五分钟》之后开始有了这样的思考,站在别人的角度思...

  • 关于理解

    刷公众号,看到了一篇空姐的采访整理,各种大爷似的客人,以及看似光鲜实则不的种种。于是,开始反省自己,是否在乘机时也...

  • 关于理解

    一段时间我见姑娘们把双肩包背在身前就无意识的觉得小气,直到后来去几回西安见识了小寨、火车站小偷旁若无人的猖獗,真觉...

  • 关于理解

    这个世界上从来没有感同身受这个词语,人与人之间的理解,从来就不曾实现过。很多时候的理解,不过是各取所需罢了。有人需...

  • 关于理解

    我们不要奢求别人对自己的伤害感同身受。一件事情对每个人的伤害程度不同,所以你不会了解别人,别人也不会了解你。就因为...

网友评论

      本文标题:关于Valotile的理解

      本文链接:https://www.haomeiwen.com/subject/pmfjcftx.html