Разделите значение локальной переменной метода между потоками в Java

Мне было дано задание найти способ поделиться локальной переменной переменной метода, включенной в несколько потоков, чтобы ее значение было видно для каждого потока, выполняющего этот метод.

Теперь мой код выглядит так:

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 ответ

В случае, если переменная last_sum обновляется только одним потоком, затем объявляется volatile буду работать. Если нет, то вы должны смотреть на AtomicInteger

Значение int, которое может быть обновлено атомарно. См. Спецификацию пакета java.util.concurrent.atomic для описания свойств атомарных переменных. AtomicInteger используется в приложениях, таких как счетчики с атомным приращением, и не может использоваться в качестве замены для Integer. Тем не менее, этот класс расширяет Number, чтобы обеспечить единообразный доступ инструментам и утилитам, которые работают с классами на основе чисел.

Вы можете иметь практическое использование AtomicInteger здесь: Практическое использование для AtomicInteger

Другие вопросы по тегам