无锁是一种乐观策略,使用CAS(compare and swap)来鉴别线程冲突,如果发生冲突,就重试当前操作直到没有冲突为止。
CAS(V,E,N) V要更新的变量,E表示预期值,N表示心值
仅当V=E时,才会将V设置为N 如果V!=E 说明已经有其他线程做了更新 当前线程什么也不做
CAS操作即使没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。
AtomicInteger
#final boolean compareAndSet(int expect, int u) //如果当前值为expect 则设置为u
compareAndSet ----> unsafe.compareAndSwapInt(Objuect obj,long valueOffset,int expect,int update)
不支持static字段
其实CAS也算是有锁操作,只不过是由CPU来触发,比synchronized性能好的多。 ---http://www.jianshu.com/p/9f0ba2bab24e
自己的应用程序无法使用Unsafe类 它是一个JDK内部使用的专属类
AtomicReference //保证修改对象引用时线程安全性
AtomicStampedReference //应用于“一次修改” 此时不仅比对值 也要比对时间戳
AtomicIntegerArray AtomicLongArray AtomicReferenceArray
AtomicIntegerFieldUpdater
利用反射机制
变量需要定义为 volatile 且不能是private static 类型
时间: 2024-12-15 03:04:11