Мало того, что variable
должно быть volatile
, но вы также хотите защитить свою update
функцию с помощью некоторой синхронизации , поскольку ++variable
не является атомарным вызовом.В конце концов, это просто синтаксический сахар для
variable = variable + 1;
, который не является атомарным.
Вы должны также обернуть все вызовы, которые читают переменную, в lock некоторогоsort.
В качестве альтернативы используйте AtomicInteger .Это было сделано для такого рода вещей (только для целочисленных операций).
public class A
{
// initially had said volatile wouldn't affect this variable because
// it is not a primitive, but see correction in comments
public final AtomicInteger variable; // see comments on this issue of why final
public void update()
{
// Called by one thread constantly
variable.getAndIncrement(); // atomically adds one
}
public int retrieveValue()
{
return variable.get(); // gets the current int value safely
}
}
public class B
{
public A a;
public void update()
{
// Called by another thread constantly
int v = a.retrieveValue();
// Do algorithm with v...
}
}
Для более сложных алгоритмов, как предполагает ваше недавнее редактирование, используйте синхронизацию или блокировки.