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赋值