У меня есть класс Java, который используется в многопоточном приложении. Параллельный доступ весьма вероятен. Несколько одновременных операций чтения не должны блокироваться, поэтому я использую блокировку ReadWrite.
class Example {
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private int i;
private boolean b;
public int getI() {
lock.readLock().lock();
final int tmp = i;
lock.readLock().unlock(),
return tmp;
}
public void setI( final int i ) {
lock.writeLock().lock();
this.i = i;
lock.writeLock().unlock();
}
public boolean getB() {
lock.readLock().lock();
final boolean tmp = b;
lock.readLock().unlock(),
return tmp;
}
public void setB( final boolean b ) {
lock.writeLock().lock();
this.b = b;
lock.writeLock().unlock();
}
}
Для простоты в этом примере я исключил блоки try...finally
вокруг замков.
Мне интересно, нужно ли (или, скажем, рекомендуется) блокировать/синхронизировать геттеры и сеттеры примитивных типов? Я знаю, что операции присваивания и возврата в Java атомарны. Однако, используя эти блокировки, разве я не удостоверяюсь, что каждый метод доступа получает самое последнее значение (равно использованию volatile
)?
Что, если бы примитивы были double
или long
?