java高并发程序设计学习笔记四无锁

1、无锁类的原理详解

1.1 CAS

CAS算法:含3个参数CAS(V,E,N)V表示要更新的量,E表示N表示新

V等于E值时,才会将V值设为N。如果VE不同,则说明已有其他线程做了更新,当前线程什么
都不做。最后,
CAS返回当前V的真实值

CAS操作是抱着乐观行的,它认为自己可以成功完成操作。

当多个线程同使用CAS操作一个,只有一个会出并更新线程不会被挂起,是被告知失,允再次尝试

当然也允线程放弃操作。基于这样的原理,CAS操作即没有,也可以发现其他线当前线程的干,并行恰当的理。


1.2 CPU指令

底层使用CPU指令实现


2、无锁类的使用

2.1 AtomicInteger

Number

public final int get() //取得当前
public final void set(int newValue) //置当前
public final int getAndSet(int newValue) //置新,并返回旧
public final boolean compareAndSet(int expect, int u)
//
如果当前值为expect则设u
public final int getAndIncrement() //
当前1,返回旧
public final int getAndDecrement() //当前1,返回旧
public final int getAndAdd(int delta) //当前增加delta,返回旧
public final int incrementAndGet() //当前1,返回新
public final int decrementAndGet() //当前1,返回新
public final int addAndGet(int delta) //当前增加delta,返回新值

2.2 Unsafe

非安全的操作,

比如:根据偏移量值;

park();

CAS操作;

非公开API,在不同版本的JDK中,可能有大差异;


主要接口:
//偏移量上的int
public native int getInt(Object o, long offset);
//
象偏移量上的int
public native void putInt(Object o, long offset, int x);
//
得字段在象中的偏移量
public native long objectFieldOffset(Field f);
//
象的int,使用volatile语义
public native void putIntVolatile(Object o, long offset, int x);
//
象的int,使用volatile语义
public native int getIntVolatile(Object o, long offset);
//
putIntVolatile(),但是它要求被操作字段就是volatile型的
public native void putOrderedInt(Object o, long offset, int x);

2.3 AtomicReference

引用行修改是一个模板,抽象化了数据型;

主要接口:

get()
set(V)
compareAndSet()
getAndSet(V)


2.4 AtomicStampedReference

可解决ABA问题 (金融交易,数字敏感的问题);

主要接口:

//较设置 参数依次:期望写入新期望时间戳 新时间
public boolean compareAndSet(V expectedReference,V newReference,int expectedStamp,int newStamp)
//
得当前象引用
public V getReference()
//
得当前时间
public int getStamp()
//
置当前象引用和时间
public void set(V newReference, int newStamp)

2.5 AtomicIntegerArray

支持无的数组;

AtomicInteger多传入一个下标,维护数组操作;


2.6 AtomicIntegerFieldUpdater

普通量也享受原子操作;

尽量少的修改已有的变量;


3、无锁算法详解

3.1 无锁的Vector实现

LockFreeVector:

相对于有所的Vector,相率低,使用synchronized加锁;

LockFreeVector内部使用AtomicReferenceArray 实现,多个 <AtomicReferenceArray >buckets 实现;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值