java原子操作类-基本类型类
来源:互联网 发布:网络映射有什么用 编辑:程序博客网 时间:2024/06/15 21:17
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。因为A和B线程在更新变量i之前拿到i的值都是1,这就是线程不安全的更新操作,通常我们可以采用synchronized来解决这个问题,但是效率比较低。
而java从1.5之后提供了atomic包,这个包中的原子操作类提供了一种用法简单、性能高效、线程安全的更新一个变量的方式。
因为变量的类型有很多种,所以在atomic包里提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性。atomic包里的类基本都是使用Unsafe实现的包装类。
使用原子的方式更新基本类型,atomic包提供了3个类:
AtomicBoolean:原子更新布尔类型
AtomicInteger:原子更新整型
AtomicLong:原子更新长整型
3个类的提供的方法基本一致,AtomicInteger主要方法如下
int addAndGet(int delta);//以原子方式将输入的数值与实例中的值相加并返回结果
boolean compareAndSet(int expect,int update);//如果输入的数值等于预期值,则以原子方式将该值设置为输入的值
int getAndIncrement();//以原子方式将当前值加1,然后返回自增前的值
void lazySet(int newValue);//最终会设置成newValue,使用lazeSet设置值后,可能导致其他线程在之后的一小段时间内还是可以读取到旧值。
int getAndSet(int newValue);//以原子方式设置为newValue的值,并返回旧值
AtomicInteger是如何实现原子操作的呢?请看源码如下
public final int getAndIncrement() { return unsafe.getAndAddInt(this, valueOffset, 1);}
public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5;}unsafe中一直循环修改变量的值,直到修改成功.
- java原子操作类-基本类型类
- java原子操作类-原子数组类
- java中的原子操作类
- Java中的原子操作类
- JAVA中的原子操作类
- java中的12个原子操作类
- Java中13个原子操作类
- java并发中的原子操作类
- 原子操作类
- 原子操作类介绍
- 原子操作基本内容
- 基本原子操作
- Java原子变量&原子操作
- Java 原子变量类
- Java原子变量类
- java.util.concurrent.atomic原子操作类包
- java.util.concurrent.atomic原子操作类包
- Java并发编程系列之十九:原子操作类
- 一致性hash
- Andrew NG 《machine learning》week 5,class2 —Backpropagation in practice
- 企业级应用架构解析
- scikit-learn : LARS
- linux下 telnet服务器的搭建
- java原子操作类-基本类型类
- 程序变量命名法:匈牙利命名、驼峰式、帕斯卡命名法
- 跟我学Android之七 资源文件
- 修改UITextField的placeholder颜色
- 关于ArrayList与BigInteger
- 求矩阵中最大(小)值并返回其行列号
- hdu2073 无限的路 瞎搞
- HDU5382 GCD?LCM!
- Python random模块