Java无锁单体,java无锁算法CAS

CAS:compare and swap,典型的无锁非阻塞算法的实现。

对共享变量进行同步最常用的方法就是加锁,但是有些情况下锁的竞争非常激烈,对锁的竞争的资源消耗比业务操作的资源消耗还要大,比如说自增自减等的操作;同时线程阻塞可能也会降低吞吐量。这时候还有一种选择就是无锁非阻塞算法。

现在的处理器最常用的方法是实现名为“比较并交换(Compare And Swap)”或 CAS 的原语。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值。否则,处理器不做任何操作。

public class Test {

/**

* @param args

*/

public static void main(String[] args) {

Test test = new Test();

SimulatedCAS cas = new SimulatedCAS();

cas.setOldValue(5);

test.setValue(cas);

test.increment();

}

private SimulatedCAS value;

public void setValue(SimulatedCAS value) {

this.value = value;

}

public int increment() {

int oldValue = value.getOldValue();

while (!(value.compareAndSwap(oldValue,oldValue + 1)))

oldValue = value.getOldValue();//需要重新从老值的地址取一遍值

return oldValue + 1;

}

}

/**

* 用synchronized模拟cup的compare and swap

* @author cuihd

*

*/

class SimulatedCAS {

private int oldValue;

public int getOldValue() {

return oldValue;

}

public void setOldValue(int oldValue) {

this.oldValue = oldValue;

}

/**

* 如果老值和预期期望的老值不一样,那么返回false

* @param expectedValue

* @param newValue

* @return

*/

public synchronized boolean compareAndSwap(int expectedValue, int newValue) {

if (oldValue == expectedValue) {

oldValue = newValue;

return true;

} else {

return false;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值