📌  相关文章
📜  Java中的 AtomicReferenceArray set() 方法及示例(1)

📅  最后修改于: 2023-12-03 14:42:44.183000             🧑  作者: Mango

Java中的 AtomicReferenceArray set() 方法及示例

在多线程并发编程中,线程安全是至关重要的。Java提供了AtomicReferenceArray类来实现原子更新数组中的元素。AtomicReferenceArray类提供了一组原子操作的方法,这些方法可以以线程安全的方式对数组中的元素进行更新。

其中之一就是set()方法,接下来我们将详细介绍这个方法及其示例使用。

AtomicReferenceArray set() 方法

AtomicReferenceArray类的set()方法用于将指定索引位置的元素设置为给定的新值。

public void set(int i, E newValue)

方法参数解释:

  • i:要设置其元素的索引。
  • newValue:要分配给给定索引的新值。
示例

考虑这样一个使用AtomicReferenceArray的示例,其中有两个线程并发地更新数组中的元素。我们想要确保这两个线程之间的并发是安全的。

import java.util.concurrent.atomic.AtomicReferenceArray;

class MyRunnable implements Runnable {
    private AtomicReferenceArray<Integer> arr;

    public MyRunnable(AtomicReferenceArray<Integer> arr) {
        this.arr = arr;
    }

    @Override
    public void run() {
        for (int i = 0; i < arr.length(); i++) {
            int oldValue;
            int newValue;
            do {
                oldValue = arr.get(i);
                newValue = oldValue + 1;
            } while (!arr.compareAndSet(i, oldValue, newValue));
            System.out.println(Thread.currentThread().getName() + " updated index: " + i + ", oldValue: " + oldValue + ", newValue: " + newValue);
        }
    }
}

public class AtomicReferenceArrayDemo {
    public static void main(String[] args) {
        final int arrLength = 10;
        AtomicReferenceArray<Integer> arr = new AtomicReferenceArray<>(arrLength);
        for (int i = 0; i < arrLength; i++) {
            arr.set(i, i);
        }

        Thread t1 = new Thread(new MyRunnable(arr), "Thread-1");
        Thread t2 = new Thread(new MyRunnable(arr), "Thread-2");

        t1.start();
        t2.start();
    }
}

该程序的输出结果应类似于以下内容:

Thread-1 updated index: 0, oldValue: 0, newValue: 1
Thread-2 updated index: 0, oldValue: 1, newValue: 2
Thread-1 updated index: 1, oldValue: 1, newValue: 2
Thread-2 updated index: 1, oldValue: 2, newValue: 3
Thread-2 updated index: 3, oldValue: 3, newValue: 4
Thread-1 updated index: 2, oldValue: 2, newValue: 3
Thread-2 updated index: 2, oldValue: 3, newValue: 4
Thread-1 updated index: 5, oldValue: 5, newValue: 6
Thread-2 updated index: 4, oldValue: 4, newValue: 5
Thread-2 updated index: 5, oldValue: 6, newValue: 7
Thread-1 updated index: 4, oldValue: 5, newValue: 6
Thread-1 updated index: 3, oldValue: 4, newValue: 5
Thread-2 updated index: 6, oldValue: 6, newValue: 7
Thread-1 updated index: 6, oldValue: 7, newValue: 8
Thread-2 updated index: 7, oldValue: 7, newValue: 8
Thread-1 updated index: 7, oldValue: 8, newValue: 9
Thread-2 updated index: 8, oldValue: 8, newValue: 9
Thread-2 updated index: 9, oldValue: 9, newValue: 10
Thread-1 updated index: 9, oldValue: 10, newValue: 11

我们可以看到,两个线程正确地并发更新了AtomicReferenceArray中的元素,避免了竞态条件导致的异常情况。

以上就是Java中的AtomicReferenceArray set()方法及其示例。