文档章节

java.util.concurrent.atomic随笔及volatile语义

刘小兵2014
 刘小兵2014
发布于 2011/07/28 19:18
字数 680
阅读 630
收藏 2
 

一个原子操作(atomic operation)是个不能分割的整体,没有其它线程(thread)能够中断或检查正在原子操作中的变量。一个原子(atomic)类型就是一个原子操作可用的类型,它可以在基本上没有锁(lock)的情况下做到线程安全(thread-safe)。

java.util.concurrent.atomic包就是提供原子操作的类的小工具包,支持在单个变量上解除锁定的线程安全编程。包中的类将volatile值、字段和数组元素的概念扩展到那写也支持原子条件更新操作的类。如AtomicReference,一个“可以用原子方式更新的对象引用”。

JDK的文档中说:“设计原子类主要用作各种块,用于实现非阻塞数据结构和相关基础结构类compareAndSet()方法不是锁定的常规替换方法。仅当对象的重要更新限于单个变量时才应用它”

类图解:

java.util.concurrent.atomic随笔及volatile语义 - javaee_chen - javaee_chen的博客

?从类图中可以清晰的得出:这些基本都是实现java常用的基本类型及他们的数组的原子实现。


volatile语义

volatile相当于synchronized的弱实现,也就是说volatile实现了类似synchronized的语义,却又没有锁机制。它确保对volatile字段的更新以可预见的方式告知其他的线程。

volatile包含以下语义:

(1)Java 存储模型不会对valatile指令的操作进行重排序:这个保证对volatile变量的操作时按照指令的出现顺序执行的。

(2)volatile变量不会被缓存在寄存器中(只有拥有线程可见)或者其他对CPU不可见的地方,每次总是从主存中读取volatile变量的结果。也就是说对于volatile变量的修改,其它线程总是可见的,并且不是使用自己线程栈内部的变量。也就是在happens-before法则中,对一个valatile变量的写操作后,其后的任何读操作理解可见此写操作的结果。

尽管volatile变量的特性不错,但是volatile并不能保证线程安全的,也就是说volatile字段的操作不是原子性的,volatile变量只能保证可见性(一个线程修改后其它线程能够理解看到此变化后的结果),要想保证原子性,目前为止只能加锁!

应用volatile变量的三个原则:

(1)写入变量不依赖此变量的值,或者只有一个线程修改此变量

(2)变量的状态不需要与其它变量共同参与不变约束

(3)访问变量不需要加锁

© 著作权归作者所有

刘小兵2014
粉丝 66
博文 532
码字总数 465927
作品 0
深圳
程序员
私信 提问
java.util.concurrent.atomic原子操作类包

这个包里面提供了一组原子变量类。其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打...

宋哥陈
2015/04/13
88
0
无锁同步-JAVA之Volatile、Atomic和CAS

1、概要 本文是无锁同步系列文章的第二篇,主要探讨JAVA中的原子操作,以及如何进行无锁同步。 关于JAVA中的原子操作,我们很容易想到的是Volatile变量、java.util.concurrent.atomic包和JVM...

kim_o
2018/06/10
29
0
CAS无锁算法:ReentrantLock,synchronized(JDK 1.6),悲观锁/乐观锁

> 悲观锁/乐观锁 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就...

desaco
2018/11/10
0
0
深入理解Java内存模型(五)——锁

深入理解Java内存模型(五)——锁 锁的释放-获取建立的happens before 关系 锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送...

蓝狐乐队
2014/06/18
94
0
PACKAGE java.util.concurrent.atomic

Package java.util.concurrent.atomic Description A small toolkit of classes that support lock-free thread-safe programming on single variables. In essence, the classes in this pa......

刘小兵2014
2011/07/28
116
0

没有更多内容

加载失败,请刷新页面

加载更多

golang 不同mysql 连接库对比

待续

caucy
1分钟前
1
0
PHP JsonWebToken的实现

废话不多说,上码(thinkphp环境) <?phpnamespace app\index\controller;class Jwt{ /** * @var array jwt头部 */ private static $header = [ //生成signatu......

yehua11
5分钟前
1
0
gitlab docker Web界面打开反应迟钝的解决办法

参考:https://blog.csdn.net/happyfreeangel/article/details/88653846 解决办法: 修改gitlab的配置文件:gitlab.rb 位置在容器中的/etc/gitlab/config 使用容器时必须挂载到外面的存储,要...

bapleliu
6分钟前
1
0
AJAX 请求 浏览器F12 看不到返回值

最近在某某高校上线AA系统之后对于某一个接口,有的时候可以界面可以正常渲染并展示正确的数据,偶尔不行。 前端开发人员打开浏览F12,指着屏幕说,AJAX请求了没有返回呀,这个要后端看看到底...

特拉仔
11分钟前
1
0
好程序员Java学习路线分享JVM类加载机制

好程序员Jav学习路线分享JVM类加载机制JVM相关概念 - jdk<br> jdk(Java Development Kit)Java开发包,是Java开发人员用于编译和调试程序的一套程序的集合。 - jre<br> jre(Java Runtime ...

好程序员官方
14分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部