在java中的线程之间共享方法局部变量值

时间:2014-03-20 11:07:22

标签: java multithreading variables shared barrier

我已经完成了找到共享方法的方法的任务,涉及多个线程,局部变量,因此对于运行此方法的每个线程,它的值都是可见的。

现在我的代码看起来像这样:

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局部变量,因此所有线程都可以看到它的值。

有什么建议吗? 它甚至可能吗? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果变量last_sum仅由一个线程更新,则声明它volatile将起作用。如果没有,那么你应该看看AtomicInteger

  

可以原子方式更新的int值。见   java.util.concurrent.atomic包规范的描述   原子变量的属性。使用AtomicInteger   应用程序,如原子递增的计数器,并不能   用作Integer的替代品。但是,这个类确实扩展了   允许通过工具和实用程序进行统一访问的编号   以数字为基础的课程。

您可以在此处AtomicInteger使用{{1}}