我已经完成了找到共享方法的方法的任务,涉及多个线程,局部变量,因此对于运行此方法的每个线程,它的值都是可见的。
现在我的代码看起来像这样:
public class SumBarrier2 implements Barrier {
int thread_num; // number of threads to handle
int thread_accessed; // number of threads come up the barrier
volatile int last_sum; // sum to be returned after new lifecyrcle
volatile int sum; // working variable to sum up the values
public SumBarrier2(int thread_num){
this.thread_num = thread_num;
thread_accessed = 0;
last_sum = 0;
sum = 0;
}
public synchronized void addValue(int value){
sum += value;
}
public synchronized void nullValues(){
thread_accessed = 0;
sum = 0;
}
@Override
public synchronized int waitBarrier(int value){
int shared_local_sum;
thread_accessed++;
addValue(value);
if(thread_accessed < thread_num){
// If this is not the last thread
try{
this.wait();
} catch(InterruptedException e){
System.out.println("Exception caught");
}
} else if(thread_num == thread_accessed){
last_sum = sum;
nullValues();
this.notifyAll();
} else if (thread_accessed > thread_num ) {
System.out.println("Something got wrong!");
}
return last_sum;
}
}
所以任务是替换类成员
volatile int last_sum
使用方法的waitBarrier局部变量,因此所有线程都可以看到它的值。
有什么建议吗? 它甚至可能吗? 提前谢谢。
答案 0 :(得分:0)
如果变量last_sum
仅由一个线程更新,则声明它volatile
将起作用。如果没有,那么你应该看看AtomicInteger
可以原子方式更新的int值。见 java.util.concurrent.atomic包规范的描述 原子变量的属性。使用AtomicInteger 应用程序,如原子递增的计数器,并不能 用作Integer的替代品。但是,这个类确实扩展了 允许通过工具和实用程序进行统一访问的编号 以数字为基础的课程。
您可以在此处AtomicInteger
使用{{1}}