volatile在多线程并发中用途非常广,原因是它有两个特性:
保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
禁止进行指令重排序。
内存模型的相关概念要想弄明白volatile的原理,先需要知道内存模型的一些概念。先看一个图:计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程...
分类:
编程语言 时间:
2016-05-13 00:50:10
阅读次数:
228
介绍在上篇博客中我详细说明了各种单例的写法和问题。以为我们已经找到很好单例写法和问题解决办法。但是Java就是这么有意思,总有新的想法提出和问题出现。
上篇博客的的双重检查加锁(double checked locking)单例在Java1.5之前也会某种情况下产生多个实例,并且volatile关键字也会导致的一些复杂的问题枚举单例在《Effective Java 》第二版第3条中,提到这一句话...
分类:
移动开发 时间:
2016-05-12 23:31:41
阅读次数:
474
(一)volatile
volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
简单地说就是防止编译器对代码进行优化.比如如下程序:
1
2
3
4
XBYTE[2]=0x55;
XBYTE[2]=0x56;
XBYTE[2]=0x57;
XB...
分类:
编程语言 时间:
2016-05-12 22:30:19
阅读次数:
235
1. Java中单元测试
2. import static
3. transient关键字
4. volatile关键字...
分类:
其他好文 时间:
2016-05-12 12:45:17
阅读次数:
121
解析AsyncTask源码之前,首先讲述与之相关的Java线程知识: 知识点清单 1、Thread类 2、Runnable接口 3、Callable接口 4、synchronized关键字 5、volatile关键字 6、Future接口 7、RunnableFuture接口 8、FutureTas ...
分类:
编程语言 时间:
2016-05-09 09:57:50
阅读次数:
225
【0】概述 volatile 是易变的、不稳定的意思。很多人根本就没见过,不知道它的存在。 volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释有点误导人;“易变”是因为外在因素引起的,像多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因, ...
分类:
其他好文 时间:
2016-05-08 15:07:38
阅读次数:
129
volatile 就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。 就像大家更熟悉的const一样 ...
以下内容大多来自周志明的《深入理解Java虚拟机》。 当一个变量被volatile修饰后,它将具备两种特性: 1. 保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内容 ...
分类:
编程语言 时间:
2016-05-07 17:56:21
阅读次数:
109
volatile限定符从性能的角度取消了编译器的优化,每次读取数据直接从内存中读取,不从编译器中读去内容Linux下gcc编译器优化:O0无优化O1缺省,O3最高优化如以下示例:主函数与信号处理函数同时对全局变量进行修改和判断。在主函数中因while循环对该全局变量的值只做判断,因此..
分类:
其他好文 时间:
2016-05-07 16:48:06
阅读次数:
406
计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。
也就是,当程序在运行过程中,...
分类:
编程语言 时间:
2016-05-07 11:21:17
阅读次数:
159