读书人

java多线程编程基础4-准确使用 Volati

发布时间: 2012-08-31 12:55:03 作者: rapoo

java多线程编程基础4--正确使用 Volatile 变量



记住一点就是:对数据的操作是分三步:

1.从内存从拿过来

2.更改数据

3.写入内存

?

还需要记住一点就是:我们在存储数据的时候,不一定是将数据存放在内存中的,有时

放在寄存器中的。所以多线程操作的时候,共有变量A如果被一个线程操作,并且存放

在寄存器中并没写入到内存中,而另一个线程操作这个变量的时候,将这个变量进行了

更改,那么第一个线程再使用变量的时候就用到了老的数据了,而并不是最新的数据了。

?

Volatile 变量的作用就是保证我们使用的变量是最新的,而不会产出脏数据的。

?

synchronized关键词就是保证同步,如果有现在在使用这个变量的时候,其他变量是无法用

这个变量的,所以保证了数据的使用是最新的。同一个时间点保证只能有一个线程在操作数据。

其他的连读取都不可以,写也不可以的。

?

------------------------------------

Java 理论与实践: 正确使用 Volatile 变量

volatile 变量使用指南

Brian Goetz?(brian.goetz@sun.com), 高级工程师, Sun Microsystems

?

简介:?Java? 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有时它更简单并且开销更低),而且其使用也更容易出错。在这期的?Java 理论与实践?中,Brian Goetz 将介绍几种正确使用 volatile 变量的模式,并针对其适用性限制提出一些建议。

查看本系列更多内容

变量,?同步机制,?正确使用,?理论与实践,?理论与实践:,?社交网络

?

标记本文!

?

发布日期:?2007 年 7 月 05 日?
级别:?中级?
访问情况 :?41798 次浏览?
评论:?6?(查看?|?添加评论?- 登录)

java多线程编程基础4-准确使用 Volatile 变量?平均分 (98个评分)
为本文评分

?

Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的?synchronized”;与?synchronized?块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是?synchronized?的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。

锁提供了两种主要特性:互斥(mutual exclusion)?和可见性(visibility)。互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题。

Volatile 变量

Volatile 变量具有?synchronized?的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式(Invariants)的类(例如 “start <=end”)。

出于简易性或可伸缩性的考虑,您可能倾向于使用 volatile 变量而不是锁。当使用 volatile 变量而非锁时,某些习惯用法(idiom)更加易于编码和阅读。此外,volatile 变量不会像锁那样造成线程阻塞,因此也很少造成可伸缩性问题。在某些情况下,如果读操作远远大于写操作,volatile 变量还可以提供优于锁的性能优势。

正确使用 volatile 变量的条件

您只能在有限的一些情形下使用 volatile 变量替代锁。要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:

读书人网 >编程

热点推荐