gpt4 book ai didi

java - AtomicIntegerArray 中的数据竞争

转载 作者:行者123 更新时间:2023-11-30 08:31:59 25 4
gpt4 key购买 nike

在下面的代码中:我在 2 个线程中更新 num[1]=0AtomicIntegerArray num 1000 次。

在主线程中 2 个线程的末尾;num[1] 的值不应该是 2000,因为 AtomicIntegerArray 中不应该有数据竞争> .

但是我得到的随机值 < 2000。有人能告诉我为什么吗?

代码:

import java.util.concurrent.atomic.AtomicIntegerArray;

public class AtomicIntegerArr {

private static AtomicIntegerArray num= new AtomicIntegerArray(2);

public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new MyRun1());
Thread t2 = new Thread(new MyRun2());

num.set(0, 10);
num.set(1, 0);

System.out.println("In Main num before:"+num.get(1));

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

t1.join();
t2.join();

System.out.println("In Main num after:"+num.get(1));
}

static class MyRun1 implements Runnable {
public void run() {
for (int i = 0; i < 1000; i++) {
num.set(1,num.get(1)+1);
}

}
}

static class MyRun2 implements Runnable {
public void run() {
for (int i = 0; i < 1000; i++) {
num.set(1,num.get(1)+1);
}

}

}

}

编辑:添加 num.compareAndSet(1, num.get(1), num.get(1)+1); 而不是 num.set(1,num.get (1)+1); 也不起作用。

最佳答案

I get random values < 2000. Could someone tell me why?

这叫做 the lost-update problem .

因为,在下面的代码中:

num.set(1, num.get(1) + 1);

虽然涉及的每个单独操作都是原子的,但组合操作不是。来自两个线程的单个操作可以交错,导致来自一个线程的更新被另一个线程的陈旧值覆盖。

可以使用compareAndSet来解决这个问题,但是要检查操作是否成功,失败了再做。

int v;
do {
v = num.get(1);
} while (!num.compareAndSet(1, v, v+1));

还有一个方法就是为了这个目的:

num.accumulateAndGet(1, 1, (x, d)->x+d);

accumulateAndGet(int i, int x, IntBinaryOperator accumulatorFunction)

Atomically updates the element at index i with the results of applying the given function to the current and given values, returning the updated value. The function should be side-effect-free, since it may be re-applied when attempted updates fail due to contention among threads. The function is applied with the current value at index i as its first argument, and the given update as the second argument.

关于java - AtomicIntegerArray 中的数据竞争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40371265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com