与前面介绍的锁和 volatile 相比较,对 final 域的读和写更像是普通的变量访问。对于final 域,编译器和处理器要遵守两个重排序规则: 下面,我们通过一些示例性的代码来分别说明这两个规则: 这里假设一个线程 A 执行 writer() 方法,随后另一个线程 B 执行 reader() ...
分类:
编程语言 时间:
2016-08-09 19:07:00
阅读次数:
325
Java语言规范第三版中对volatile的定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致性的更新,线程应该确保通过排他锁 单独获得这个变量。 volatile有时候比锁更加方便,比如一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的 ...
分类:
编程语言 时间:
2016-08-09 08:11:39
阅读次数:
318
volatile 的特性 当我们声明共享变量为 volatile 后,对这个变量的读/写将会很特别。理解 volatile 特性的一个好方法是:把对 volatile 变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码: 假设有多个线程 ...
分类:
编程语言 时间:
2016-08-08 00:35:28
阅读次数:
214
volatile 变量使用指南 volatile 变量使用指南 Java? 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的 ...
分类:
编程语言 时间:
2016-08-06 09:43:44
阅读次数:
270
1,volatile
它所修饰的变量不保留拷贝,直接访问主内存中的。
在Java内存模型中,有main memory,每个线程也有自己的memory (例如寄存器)。为了性能,一个线程会在自己的memory中保持要访问的变量的副本。这样就会出现同一个变 量在某个瞬间,在一个线程的memory中的值可能与另外一个线程memory中的值,或者main memory中的值不一致的情况。...
分类:
其他好文 时间:
2016-08-05 10:16:48
阅读次数:
112
引自:http://www.cnblogs.com/michaelxu/archive/2008/09/20/1293716.html 一、volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的。它只能在变量一级做同步,volatile的含义就是告诉处理器, 不要将我 ...
分类:
编程语言 时间:
2016-08-02 16:52:21
阅读次数:
282
https://www.techopedia.com/definition/8591/non-volatile-register https://msdn.microsoft.com/en-us/library/9z1stfyw.aspx ...
分类:
其他好文 时间:
2016-08-02 11:38:01
阅读次数:
175
一、非原子的64位操作: 当线程在没有同步的情况下读取变量时,可能会得到一个失效值,但至少这个值是由之前某个线程设置的值,而不是一个随机值,这种安全性保证被称为最低安全性。最低安全性适用于绝大多数变量,但存在一个例外:非volatile类型的64位数值变量(double,long),Java内存模型 ...
分类:
编程语言 时间:
2016-08-02 08:54:58
阅读次数:
211
Java中long和double赋值不是原子操作,因为先写32位,再写后32位,分两步操作,这样就线程不安全了。如果改成下面的就线程安全了private volatile long number = 8;那么,为什么是这样?volatile关键字难道可以保证原子性?java程序员很熟悉的一句话:vo ...
分类:
编程语言 时间:
2016-08-01 21:06:13
阅读次数:
197
在查找资料和学习的过程中留下的一点总结,敬请拍砖指教。 程序、进程、线程的区别? 进程是一个程序的进行时状态,一个程序运行在不同的数据集上可以形成多个进程。线程是进程的一个运行单元,一个进程中可以有多个线程。 volatile 和 synchronized 区别 volatile 是变量修饰符,使线 ...
分类:
编程语言 时间:
2016-07-29 16:22:31
阅读次数:
123