您的位置:首页 > 编程语言 > Java开发

Java并行程序基础(十二)

2017-04-04 00:00 85 查看
无锁

对于并发控制而言,锁是一种悲观策略。它总是假设每一次的临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果多个线程同时需要访问临界区资源,就宁可牺牲性能让线程进行等待,所以说锁会阻塞线程执行。而无锁是一种悲观策略,它会假设对资源的访问没有冲突。既然没有冲突,自然不需要等待,所以所有的线程都可以在不停顿的状态下继续执行。如果遇到冲突,无锁的策略使用一种叫做比较交换的技术(CAS Compare And Swap)来鉴别线程冲突,一旦检测到冲突,就重试当前操作一直到没有冲突为止。

CAS算法的过程是这样的:它包含三个参数CAS(V,E,N).V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。CAS操作抱着乐观的态度进行的,它总是认为自己可以完成操作。当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CAS操作即使没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。

1.无锁的应用:AtomicInteger

public final int get() //取得当前值
public final void set(int newValue) //设置当前值
public final int getAndSet(int newValue) //设置新值,并返回旧值
public final boolean compareAndSet(int expect, int update) //如果当前值为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,返回新值

AtomicInteger中保存了一个核心字段:

private volatile int value;//代表当前的实际取值

private static final long valueOffset; //保存着value字段在AtomicInteger对象中的偏移量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: