java两个线程互相访问的时候并不能按照你的思路运行,因为执行语句可能有前后快慢之分,比如a=1和flag=true。下面线程B访问的时候 这两个赋值语句不一定按顺序执行 产生这种原因是因为指令重排序造成的。这种重排只会出现在不影响串行的结构下进行指令的优化(去掉等待的气泡,这是一种编译器的自动优化 ...
分类:
编程语言 时间:
2017-05-21 14:56:16
阅读次数:
298
Java内存模型与线程Java内存模型与线程
Start
硬件的效率与一致性
Java内存模型
主内存与工作内存
内存间交互操作
对于volatile型变量的特殊规则
可见性
禁止指令重排序优化
对于...
分类:
编程语言 时间:
2017-05-14 18:01:31
阅读次数:
628
前言: 在做单例模式时 有博客在评论区 推荐使用 volatile 关键字 进行修饰 然后用了两天时间查资料看文档 发现涉及的面太广 虽然已经了解为什么要使用 volatile + synchronized 来写单例模式 但是限于目前的水平有限 无法很好的进行个人总结故 转发一篇 总结得很不错的博客 ...
分类:
编程语言 时间:
2017-04-08 13:52:19
阅读次数:
216
在学习volatile语义的可见性和禁止指令重排序的相关测试中,发现并不能体现出禁止指令重排序的特性 实验代码如下 实验步骤: 注意关注代码中flag变量,会分别测试flag变量有volatile修饰和没有volatile修饰时的输出情况 本测试代码主要的功能: 实验步骤: 预期结果: 实际结果: ...
分类:
编程语言 时间:
2017-03-01 15:42:11
阅读次数:
271
单例模式 单例模式是一种比较常见的模式,看起来很简单,但是要做到高效安全的使用,其中还是有很多要点的。参考了Head First及众多网友的文章,稍微总结一下,以备查看。 单例模式的定义:确保一个类只有一个实例,并且提供一个全局访问点。 1. 最简单的单例(饿汉模式),程序一加载就对 instanc ...
分类:
其他好文 时间:
2016-12-30 02:27:28
阅读次数:
184
一、不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它;我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它。比如Thread这个很基础的类,其中很重要的线程状态字段,就是用volati ...
分类:
移动开发 时间:
2016-12-26 00:28:29
阅读次数:
374
1. 前言 Java的单例有多种实现方式:单线程下的简单版本、无法在指令重排序下正常工作的Double-Check、static、内部类+static、枚举……。这篇文章要讨论的,是在使用static实现饿汉模式的单例时,会有隐患存在。 2. Static单例的隐患 2.1 传统写法 static实 ...
分类:
其他好文 时间:
2016-12-16 09:54:43
阅读次数:
226
1.volatile 主要是 其 "可见性",在java内存模型中,变量都是放在主内存中,每条线程里面有自己的工作内存,当一个变量被volatile 修饰时候,其他的线程会得到该变量的最新值。但是volatile并不能保证该变量的原子性。 2.在什么时候用volatile?指令重排序优化,普通的变量 ...
分类:
其他好文 时间:
2016-12-07 02:09:58
阅读次数:
143
(1)双重校验锁 1)构造函数和对象私有化 2)对象用violate和static关键字修饰 3)公有的静态获取对象方法 4)双重校验锁 violate关键字作用:防止指令重排序 创建对象可以分解为如下的3行伪代码 memory=allocate(); //1:分配对象的内存空间 ctorInsta ...
分类:
其他好文 时间:
2016-11-13 13:40:08
阅读次数:
156
1、首先为何要指令重排序(instruction reordering)? 编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。 也就是说,对于下面两条语句: int a = 10; int b = 20; 在计算机执行上面两句话的时候,有可能第二条语句会先于第一条语句执行。 ...
分类:
编程语言 时间:
2016-09-21 15:47:54
阅读次数:
155