java无锁算法CAS

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


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

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


<span style="font-size:18px;">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;
		}
	}
}</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值