マルチスレッドアプリケーションで使用される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
ますか?