CAS(Compare-And-Swap)是一种无锁化的原子操作,用于多线程环境下的并发控制。它包含三个参数:内存地址V、期望值E和新值N。仅当V的值等于E时,才会将V的值设为N,否则不做任何操作。CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。
C中的CAS操作
```csharp
public bool Cas(ref object obj, object expected, object newValue)
{
object oldValue = obj;
if (oldValue == expected)
{
obj = newValue;
return true;
}
return false;
}
```
Java中的CAS操作
Java中的`java.util.concurrent.atomic`包提供了多种支持CAS操作的原子类,例如`AtomicInteger`、`AtomicLong`、`AtomicReference`等。
使用`AtomicInteger`进行CAS操作
```java
import java.util.concurrent.atomic.AtomicInteger;
public class CASExample {
public static void main(String[] args) throws InterruptedException {
AtomicInteger atomicInteger = new AtomicInteger(0);
int expectedValue = 0;
int newValue = 100;
boolean isSuccess = atomicInteger.compareAndSet(expectedValue, newValue);
System.out.println("CAS操作是否成功: " + isSuccess);
System.out.println("当前值: " + atomicInteger.get());
}
}
```
使用`AtomicReference`进行CAS操作
```java
import java.util.concurrent.atomic.AtomicReference;
public class CASDemo {
public static void main(String[] args) {
AtomicReference System.out.println("线程" + Thread.currentThread().getName() + "\t" + atomicInteger.compareAndSet(5, 2022) + "\t当前值:" + atomicInteger.get()); System.out.println("线程" + Thread.currentThread().getName() + "\t" + atomicInteger.compareAndSet(5, 2000) + "\t当前值:" + atomicInteger.get()); } } ``` 总结 CAS操作是一种高效的并发控制手段,通过比较和替换的原子性操作,避免了传统锁机制的开销和线程切换问题。在多线程编程中,合理使用CAS操作可以提高程序的性能和安全性。