【Java多线程】Java中的原子操作类:原子整数&原子引用&原子数组&原子更新字段类&Unsafe对象

1.原子整数

J.U.C并发包提供了AtomicBoolean,AtomicInteger,AtomicLong。

1.1 AtomicInteger

1.1.1

api:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html
方法都是原子的,利用CAS保证了线程安全。

举例:
incrementAndGet():自增,相当于++i
getAndAdd(int delta):相当于获取这个数,并加delta。

1.1.2 updateAndGet

还有getAndUpdate,这里以updateAndGet(先计算,后获取值)为例。

介绍

使用例子:

AtomicInteger i=new AtomicInteger(5);
i.updateAndGet(value->value*10);
System.out.println(i.get());//返回50
//------------读取到->设置值------------
原理

循环进行CAS操作,直至成功。
在这里插入图片描述

1.1.3 其他类型的原子更新

在这里插入图片描述

2.原子引用

AtomicReference,AtomicStampedReference,AtomicMarkableReference。

2.1 AtomicReference

2.1.1 使用

举例如下
在这里插入图片描述

2.1.2 ABA问题

在这里插入图片描述
解决办法见2.2

2.2 AtomicStampedReference

特点:加版本号

使用

举例
在这里插入图片描述
在这里插入图片描述

2.3 AtomicMarkableReference

特点:不需要记录版本号,只需要记录是否更改过

具体可以看看这篇博客:http://www.nituchao.com/juc-atomic/24.html

public boolean compareAndSet(V   expectedReference,
                             V   newReference,
                             int expectedMark,
                             int newMark) ;
                             
public void set(V newReference, int newMark);

3.原子数组

在这里插入图片描述

4.原子更新字段类

如果需原子地更新某个类里的某个字段时,就需要使用原子更新字段类。
要想原子地更新字段类需要两步。第一步,因为原子更新字段类都是抽象类,每次使用的 时候必须使用静态方法newUpdater()创建一个更新器,并且需要设置想要更新的类和属性。第 二步,更新类的字段(属性)必须使用public volatile修饰符。
举例:
在这里插入图片描述

5.Unsafe

概述

Unsafe对象提供了底层的,操作内存、线程的方法,Unsafe对象不能直接调用,只能通过反射获得。
前面的原子操作类的很多方法实际是调用了UnSafe中的方法。
在这里插入图片描述

CAS

使用示例:给id赋值
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值