java实现CAS代码示例

以下是一个简单的Java代码示例,演示了如何使用CAS(Compare and Swap)来实现对共享变量的原子操作:

import java.util.concurrent.atomic.AtomicInteger;

public class CASExample {
    
    
    private static AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) {
    
    
        // 创建两个线程,分别进行增加操作
        Thread thread1 = new Thread(new IncrementTask());
        Thread thread2 = new Thread(new IncrementTask());

        // 启动线程
        thread1.start();
        thread2.start();

        // 等待线程执行完成
        try {
    
    
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }

        // 打印最终结果
        System.out.println("Counter: " + counter.get());
    }

    static class IncrementTask implements Runnable {
    
    
        @Override
        public void run() {
    
    
            for (int i = 0; i < 1000; i++) {
    
    
                int oldValue;
                int newValue;

                do {
    
    
                    // 获取当前的值
                    oldValue = counter.get();
                    // 计算新值
                    newValue = oldValue + 1;
                    // 使用CAS尝试更新值
                } while (!counter.compareAndSet(oldValue, newValue));
            }
        }
    }
}

在这个示例中,我们使用AtomicInteger类来创建一个原子整型变量counterAtomicInteger提供了一组原子操作方法,包括get()用于获取当前值,compareAndSet()用于比较并交换操作。

IncrementTaskrun()方法中,我们使用compareAndSet()方法进行原子操作。我们不断地尝试获取当前值,并计算新值,然后使用compareAndSet()方法来比较旧值和当前值,如果相等则进行原子更新。如果比较失败,说明其他线程已经修改了变量的值,我们需要重新获取最新的值并再次尝试更新,直到更新成功为止。

counter.compareAndSet(oldValue, newValue)AtomicInteger 类中的一个方法,用于比较当前值和期望值,并在相等的情况下原子地设置新值。

具体来说,compareAndSet(oldValue, newValue) 方法的作用如下:

  1. 比较:它首先将当前 AtomicInteger 对象的值与 oldValue 进行比较,如果两者相等,则认为比较成功。

  2. 设置:如果比较成功,就将当前 AtomicInteger 对象的值原子地设置为 newValue

  3. 原子性:整个比较和设置操作是原子的,即在比较和设置期间,不会有其他线程对该变量进行修改,保证了操作的原子性。

关于 compareAndSet(oldValue, newValue) 方法需要注意的几点:

  • 当比较成功时,表示当前值与 oldValue 相等,说明没有其他线程修改过该值。此时,可以原子地将该值设置为 newValue
  • 当比较失败时,表示当前值与 oldValue 不相等,说明其他线程已经修改了该值。此时,compareAndSet() 方法不会修改当前值,并返回 false
  • compareAndSet(oldValue, newValue) 方法返回一个布尔值,表示操作是否成功。如果返回 true,则表示设置成功;如果返回 false,则表示设置失败。

在示例中,compareAndSet(oldValue, newValue) 方法用于尝试将新值 newValue 赋给 AtomicInteger 对象 counter,前提是当前值与期望值 oldValue 相等。如果比较成功,表示没有其他线程修改过 counter 的值,那么将 newValue 设置为新的值;如果比较失败,说明其他线程已经修改了 counter 的值,那么重试直到设置成功。

使用 compareAndSet(oldValue, newValue) 方法可以确保对共享变量的原子更新,避免多线程并发修改导致的数据不一致问题。

猜你喜欢

转载自blog.csdn.net/a772304419/article/details/130997407
今日推荐