少年阿宾

那些青春的岁月

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
1、volatile

volatile字段的写入操作happens-before于每一个后续的同一个字段的读操作。

因为实际上putremove等操作也会更新count的值,所以当竞争发生的时候,volatile的语义可以保证写操作在读操作之前,也就保证了写操作对后续的读操作都是可见的,这样后面get的后续操作就可以拿到完整的元素内容。

使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。


volatile实际上只有在多cpu或者多核下才有用。当读取数据时,他不会cache缓存中读取,而是强制从内从中读取,这样读到的就是最新值。当写入数据的时候,会直接将数据写入内存中,并刷新所有其他核中的缓存,这样其他核看到的就是最新写入的值,也就是说,其他线程就看到了最新写入的值。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;


声明方式为  volatile declaration


备注
系统总是在 volatile 对象被请求的那一刻读取其当前值,即使上一条指令从同一对象请求值。而且,该对象的值在赋值时立即写入。

volatile 修饰符通常用于由多个线程访问而不使用 lock 语句来序列化访问的字段。使用 volatile 修饰符能够确保一个线程检索由另一线程写入的最新值。


posted on 2015-01-18 21:08 abin 阅读(377) 评论(0)  编辑  收藏 所属分类: volatile

只有注册用户登录后才能发表评论。


网站导航: