Мой вопрос относится к тому, что использование ReentrantLock гарантирует видимость поля в том же отношении, что и синхронизированное ключевое слово.Требуется ли ключевое слово volatile для полей, доступных через ReentrantLock?
Например, в следующем классе , поле sharedData не должны быть объявлены летучим, как используется ключевое слово синхронизированы.
class A
{
private double sharedData;
public synchronized void method()
{
double temp = sharedData;
temp *= 2.5;
sharedData = temp + 1;
}
}
Для следующего примера, используя ReentrantLock, является ли волатильное ключевое слово на нужном поле?
class B
{
private final ReentrantLock lock = new ReentrantLock();
private volatile double sharedData;
public void method()
{
lock.lock();
try
{
double temp = sharedData;
temp *= 2.5;
sharedData = temp + 1;
}
finally
{
lock.unlock();
}
}
}
Я знаю, что с помощью летучего ключевое слово в любом случае будет только вероятно наложить мизерный удар по производительности, но я все же хотел бы, чтобы правильно закодировать.
Является ли этот совет верным относительно 'while (field)' из-за подъема поля? – Pod
@Pod: без каких-либо конкретных подробностей о том, как петля 'while' взаимодействует с блокировкой, невозможно сказать. Вероятно, вы хотите создать новый вопрос с конкретным примером. –