Java并行程序基础(十二)
博客专区 > 1527 的博客 > 博客详情
Java并行程序基础(十二)
1527 发表于11个月前
Java并行程序基础(十二)
  • 发表于 11个月前
  • 阅读 13
  • 收藏 2
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

  • 无锁

对于并发控制而言,锁是一种悲观策略。它总是假设每一次的临界区操作会产生冲突,因此,必须对每次操作都小心翼翼。如果多个线程同时需要访问临界区资源,就宁可牺牲性能让线程进行等待,所以说锁会阻塞线程执行。而无锁是一种悲观策略,它会假设对资源的访问没有冲突。既然没有冲突,自然不需要等待,所以所有的线程都可以在不停顿的状态下继续执行。如果遇到冲突,无锁的策略使用一种叫做比较交换的技术(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对象中的偏移量

 

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 5
博文 78
码字总数 27592
×
1527
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: