Разделите значение локальной переменной метода между потоками в 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