CAS(compare and swap)算法、保证原子性

CAS是支持并发的第一个CPU提供原子的测试并设置操作,通常在单位上运行这项操作。操作数为V,A,B。

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。

如果内存位置的值与预期原值相匹配(V==A),那么处理器会自动将该位置值更新为新值。

否则,处理器不做任何操作。

无论哪种情况,它都会在 CAS 指令之前返回该位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前值。)CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置的值即可。”

CAS算法目的就是保证原子性(一个完整的操作  “读-改-写”) 

计算机要修改一个值 的过程分三步:

①、首先会读取这个值到自己独立的内存中。

②、在自己独立内存中进行更新操作(修改值)。

③、然后将修改过后的值重新写入到内存中

这样是一个完整的过程。

 在这个过程中如果有其它线程对上面线程要修改的值进行改操作,会导致写入的值不是正确的值。

模拟CAS算法示例:

/*
 * 模拟 CAS 算法
 */
public class TestCompareAndSwap {
 
	public static void main(String[] args) {
		final CompareAndSwap cas = new CompareAndSwap();
		
		for (int i = 0; i < 10; i++) {
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					int expectedValue = cas.get();
					boolean b = cas.compareAndSet(expectedValue, (int)(Math.random() * 101));
					System.out.println(b);
				}
			}).start();
		}
		
	}
	
}
 
class CompareAndSwap{
	private int value;
	
	//获取内存值
	public synchronized int get(){
		return value;
	}
	
	//比较
	public synchronized int compareAndSwap(int expectedValue, int newValue){
		int oldValue = value;
		
		if(oldValue == expectedValue){
			this.value = newValue;
		}
		
		return oldValue;
	}
	
	//设置
	public synchronized boolean compareAndSet(int expectedValue, int newValue){
		return expectedValue == compareAndSwap(expectedValue, newValue);
	}
}
发布了242 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41813208/article/details/103946028