【发布时间】:2021-12-11 06:55:31
【问题描述】:
我一直致力于实现一个自定义的循环障碍,它将传递给 await 方法的值相加,并在调用 notify 后将总和返回给所有线程。
代码:
public class Barrier {
private final int parties;
private int partiesArrived = 0;
private volatile int sum = 0;
private volatile int oldSum = 0;
public Barrier(int parties) {
if (parties < 1) throw new IllegalArgumentException("Number of parties has to be 1 or higher.");
this.parties = parties;
}
public int getParties() { return parties; }
public synchronized int waitBarrier(int value) throws InterruptedException {
partiesArrived += 1;
sum += value;
if (partiesArrived != parties) {
wait();
}
else {
oldSum = sum;
sum = 0;
partiesArrived = 0;
notifyAll();
}
return oldSum;
}
public int getNumberWaiting() { return partiesArrived; }
}
这可行,但我听说有一种方法可以将值sum 和oldSum(或至少oldSum)更改为waitBarrier 方法的局部变量。然而,在我绞尽脑汁之后,我没有看到任何方法。
有没有可能,如果有,怎么做?
【问题讨论】:
-
oldSum,当然。但是sum怎么可能是一个局部变量呢?线程不能共享局部变量。如果线程不相互共享,它们如何计算总和? -
@SolomonSlow,你能详细说明一下
oldSum是如何变成局部变量的吗? -
嗯,...去掉
oldSum的类级声明,在waitBarrier(...)函数内声明int oldSum。 -
@SolomonSlow 不起作用。总和不会相同
-
和什么一样?只有一笔。您只使用
oldSum作为临时存储来保存它,以便您可以在返回之前的值之前设置sum = 0。
标签: java concurrency barrier shared-variable