gpt4 book ai didi

java - 累加器是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-02 09:19:58 25 4
gpt4 key购买 nike

我正在使用累加器并想知道这些对象是否是线程安全的?

accumIntAccumulatorParam<Integer> 的一种类型.

// Current value accumInt -> 6
AccumulatorThread t1 = new AccumulatorThread();
t1.setAccum(accumInt);
t1.setValueToAdd(5);

AccumulatorThread t2 = new AccumulatorThread();
t2.setAccum(accumInt);
t2.setValueToAdd(7);

new Thread(t1).start();
new Thread(t2).start();

System.out.println(accumInt.value()); // 11 or 13 or 18

AccumlatorThread类:

class AccumulatorThread implements Runnable {
Accumulator<Integer> accum;
Integer valueToAdd;

public Integer getValueToAdd() {
return valueToAdd;
}


public void setValueToAdd(Integer valueToAdd) {
this.valueToAdd = valueToAdd;
}

public Accumulator<Integer> getAccum() {
return accum;
}


public void setAccum(Accumulator<Integer> accum) {
this.accum = accum;
}

public void run() {
System.out.println("Value to Add in Thread : "+valueToAdd);
accum.add(valueToAdd);
}
}

该行为表明它不是线程安全的。我错过了什么吗?

最佳答案

OOC 为什么你在同一个程序中设置和读取累加器?累加器通常由工作线程添加,并且只能由驱动程序线程读取。

Worker1:   accumulator.add(increment)
Worker2: accumulator.add(someOtherIncrement)

Driver: println(accumulator.value)

现在您询问有关在驱动程序上的不同线程中设置/读取值的多线程。目的是什么?在这种情况下,只需使用本地 JVM AtomicIntegerAtomicLong

累加器是仅通过关联运算“添加”的变量,因此可以有效地支持并行。

关于java - 累加器是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27438591/

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