什么是重排序编译器和处理器为了提高程序的运行性能,对指令进行重新排序。数据依赖性(as-if-serial) 写后读,读后写,写后写指令重排序分类 编译器重排序和处理器重排序为什么要进行指令重排序指令重排序所带来的影响竞争与同步 Java内存访问重排序的研究 Java并发:volatile内存可见性 ...
分类:
编程语言 时间:
2018-04-15 11:42:11
阅读次数:
199
我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况。 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再把需求明确一点,一个java线程对一个变量的更新怎么通知到另外一个线程呢?我们知道java当中的实例 ...
分类:
编程语言 时间:
2018-03-11 21:08:22
阅读次数:
211
要保证线程安全,必须保证两点:共享变量的可见性、临界区代码访问的顺序性。 ...
分类:
编程语言 时间:
2018-02-02 14:34:25
阅读次数:
203
volatile详解接下来,我们详细讲述一下volatile关键字volatile关键字具有两重语义 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这个新值对其他线程来说是立即可见的。 禁止指令重排序 依然使用上文RunThread案例说明,上文中已经提到了,由于主线程修 ...
分类:
其他好文 时间:
2018-01-22 17:25:52
阅读次数:
133
直想写点关于设计模式的东西,却懒到现在都没写过什么,今天上午看到项目中的代码,就在这个中午抽出时间写点东西,抛个项目截图先: 单例模式: 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对 ...
分类:
编程语言 时间:
2018-01-15 14:54:52
阅读次数:
212
1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 先看一段代码,假如线 ...
分类:
其他好文 时间:
2018-01-12 11:29:30
阅读次数:
303
volatile 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 ...
分类:
编程语言 时间:
2018-01-02 17:53:41
阅读次数:
131
使用volatile修饰符修饰共享变量(类的成员变量或者类的静态成员变量)会产生两个效果: 1:保证了不同线程对这个变量操作的可见性,即:一个线程修改了这个变量的值,修改结果对其他线程是立即可见的; 2:禁止指令重排序; 使用volatile关键字,会强制性的将修改的值立即写入主存;当线程2进行修改 ...
分类:
其他好文 时间:
2017-12-27 12:02:46
阅读次数:
144
在知乎上看到一个问题《java中volatile关键字的疑惑?》,引起了我的兴趣 问题是这样的: 这段代码的主要目的是:主线程修改非volatile类型的全局变量stop,子线程轮询stop,如果stop发生变动,则程序退出。 但是如果实际运行这段代码会造成死循环,程序无法正常退出。 我们当然知道由 ...
分类:
编程语言 时间:
2017-12-04 20:38:42
阅读次数:
219
java并发采用的是共享内存模型,线程之间的通信对程序员来说是透明的,内存可见性问题很容易困扰着java程序员,今天我们就来揭开java内存模型的神秘面纱。 在揭开面纱之前,我们需要认识几个基础概念:内存屏障(memory Barriers),指令重排序,happens-before规则,as-if ...
分类:
编程语言 时间:
2017-11-25 15:22:34
阅读次数:
234