大家知道多线程更新一个变量可能得到期望之外的结果,也就是说这种更新操作是线程不安全的,而原子操作提供了一种简单高效且线程安全的更新变量的方式。下面我们介绍Java为我们提供的12个原子操作类及其使用方式。
一、原子操作更新基本类型
包含的类如下:AtomicBoolean原子更新布尔类型
AtomicInteger原子更新整型
AtomicLong原子更新长整型
由于这三个类提供的方法几乎一致,这里我们只以AtomicInteger为例进行介绍。
1.1.常用方法http://1.int addAndGet(int delta)
以原子的方式将输入的数值与实例中的值(AtomicInteger种的value)相加,并返回结果。
2.boolean compareAndSet(int expect, int update)
如果输入的值等于预期值,则以原子方式将该值设置为输入的值。
http://3.int getAndIncrement()
以原子的方式将当前值加1,注意,这里返回的是自增前的值。
4.void lazySet(int newValue)
最终会设置成newValue,使用lazySet设置值后,可能导致其他线程在之后的一小段时间内还是可以读到旧的值。
http://5.int getAndSet(int newValue)
以原子方式设置为newValue的值,并返回旧值。
1.2.示例代码
二、原子更新数组
包含的类如下:AtomicIntegerArray原子更新整型数组里的元素。
AtomicLongArray原子更新长整型数组里的元素。
AtomicReferenceArray原子更新引用类型数组里的元素。
由于这三个类提供的方法几乎一致,这里我们只以AtomicIntegerArray为例进行介绍。
2.1.常用方法http://1.int addAndGet(int i, int delta)
以原子方式将输入值与数组中索引i的元素相加,返回新值。
http://2.int getAndSet(int i, int newValue)
以原子方式将输入值与数组中索引i的元素相加,返回旧值。
http://3.int getAndIncrement(int i)
以原子方式将数组中索引i的元素加1,返回旧值。
http://4.int getAndDecrement(int i)
以原子方式将数组中索引i的元素减1,返回旧值。
5.boolean compareAndSet(int i, int expect, int update)
如果当前值等于预期值,则以原子方式将数组位置i的元素设置为update值。
2.2.示例代码
三、原子更新引用类型
包含的类如下:AtomicReference原子更新引用类型。
AtomicReferenceFieldUpdater原子更新引用类型的字段。
AtomicMarkableReferce原子更新带有标记位的引用类型。
由于这三个类提供的方法几乎一致,这里我们只以AtomicReference为例进行介绍。
3.1.示例代码
四、原子更新属性
包含的类如下:AtomicIntegerFieldUpdater原子更新整型的字段的更新器。
AtomicLongFieldUpdater原子更新长整型字段的更新器。
AtomicStampedFieldUpdater原子更新带有版本号的引用类型。
由于这三个类提供的方法几乎一致,这里我们只以AtomicIntegerFieldUpdater为例进行介绍。
4.1.使用步骤1.因为原子更新字段类都是抽象类,每次使用的时候必须使用静态方法newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。
2.更新类的字段必须使用public volatile修饰。
4.2.示例代码
1.欢迎点赞和评论。
2.后续我会为大家提供更多Java并发编程的内容,欢迎关注我。