📅  最后修改于: 2023-12-03 14:42:44.183000             🧑  作者: Mango
在多线程并发编程中,线程安全是至关重要的。Java提供了AtomicReferenceArray类来实现原子更新数组中的元素。AtomicReferenceArray类提供了一组原子操作的方法,这些方法可以以线程安全的方式对数组中的元素进行更新。
其中之一就是set()方法,接下来我们将详细介绍这个方法及其示例使用。
AtomicReferenceArray类的set()方法用于将指定索引位置的元素设置为给定的新值。
public void set(int i, E 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()方法及其示例。