Java中原子类的实现
来源:互联网 发布:怎样练英语发音 知乎 编辑:程序博客网 时间:2024/04/28 02:35
Java提供的原子类是靠sun基于CAS实现的,CAS是一种乐观锁。关于乐观锁与悲观锁。
原子变量类相当于一种泛化的volatile变量,能够支持原子的和有条件的读-改-写操作。AtomicInteger表示一个int类型的值,并提供了get和set方法,这些Volatile类型的int变量在读取和写入上有着相同的内存语义。它还提供了一个原子的compareAndSet方法(如果该方法成功执行,那么将实现与读取/写入一个volatile变量相同的内存效果),以及原子的添加、递增和递减等方法。AtomicInteger表面上非常像一个扩展的Counter类,但在发生竞争的情况下能提供更高的可伸缩性,因为它直接利用了硬件对并发的支持。
AtomicInteger的实现
AtomicInteger 是一个支持原子操作的 Integer 类,就是保证对AtomicInteger类型变量的增加和减少操作是原子性的,不会出现多个线程下的数据不一致问题。如果不使用 AtomicInteger,要实现一个按顺序获取的 ID,就必须在每次获取时进行加锁操作,以避免出现并发时获取到同样的 ID 的现象。
接下来通过源代码来看AtomicInteger具体是如何实现的原子操作。
首先看incrementAndGet() 方法,下面是具体的代码:
通过源码,可以知道,这个方法的做法为先获取到当前的 value 属性值,然后将 value 加 1,赋值给一个局部的 next 变量,然而,这两步都是非线程安全的,但是内部有一个死循环,不断去做compareAndSet操作,直到成功为止,也就是修改的根本在compareAndSet方法里面,compareAndSet()方法的代码如下:
compareAndSet()方法调用的compareAndSwapInt()方法的声明如下,是一个native方法。
compareAndSet 传入的为执行方法时获取到的 value 属性值,next 为加 1 后的值, compareAndSet 所做的为调用 Sun 的 UnSafe 的 compareAndSwapInt 方法来完成,此方法为 native 方法,compareAndSwapInt 基于的是 CPU 的 CAS 指令来实现的。所以基于 CAS 的操作可认为是无阻塞的,一个线程的失败或挂起不会引起其它线程也失败或挂起。并且由于 CAS 操作是 CPU 原语,所以性能比较好。
类似的,还有 decrementAndGet() 方法。它和 incrementAndGet() 的区别是将 value 减 1,赋值给next 变量。
AtomicInteger 中还有 getAndIncrement() 和 getAndDecrement() 方法,他们的实现原理和上面的两个方法完全相同,区别是返回值不同,前两个方法返回的是改变之后的值,即 next。而这两个方法返回的是改变之前的值,即 current。还有很多的其他方法,就不列举了。
- Java中原子类的实现
- Java并发中原子操作的实现
- SQLITE中原子提交的实现
- Java List子类ArrayList的实现原理
- ARM体系结构中原子操作 ATOMIC 的实现
- 骗子的“中原教育”
- Java的原子类
- java中的CAS和原子类的实现
- Java中如何获得所有实现该接口的子类
- Enumeration子类的实现调用
- Linux内核ARM构架中原子变量的底层实现研究
- Linux内核ARM构架中原子变量的底层实现研究
- Linux内核ARM构架中原子变量的底层实现研究
- Linux内核ARM构架中原子变量的底层实现研究
- Linux内核ARM构架中原子变量的底层实现研究
- Android中原http请求的https实现(URLConnection 、volley)(volley不修改源码)
- Linux内核ARM构架中原子变量的底层实现研究
- Android中原http请求的https实现(URLConnection 、volley)(volley不修改源码)
- PAT (Basic Level) Practise 1014. 福尔摩斯的约会 (20)
- 笔试基础归纳-8.19
- werkzeug.utils.import_string的用处
- 二十一、修改头像(2)----上传头像图片
- linux环境下基于UDP的 客户端服务器模型
- Java中原子类的实现
- 关于TCP校验和的一些实验体会
- C++标准模板库(STL)使用 01
- React.js学习版2~
- Redis深入之路(七)
- Linux下安装Nginx详细图解教程
- OI算法汇总
- asdfghjk
- android studio 2.0 引导页示例