私は、複数のスレッドからアクセスされるオブジェクトを持っています。私はそれを実装したいので、セッターとゲッターにアクセスするには、呼び出し元は先に明示的にロックしてから終了しなければなりません。私は同期メソッドを使用していますが、それはjavaのより明示的なロックAPIに比べて非常に単純なようには見えません。これはReentrantLockを使用した私の現在のスタブ付き実装です。Javaオブジェクトのロックを明示的に保持する方法
public class Data {
private ReentrantLock lock;
private int IntValue;
public Data() {
this.IntValue = 0;
this.lock = new ReentrantLock();
}
public void Lock() {
lock.lock();
}
public void Unlock() {
if (!lock.isLocked()) {
return;
}
//only the thread owning the lock can proceed to unlock
lock.lock();
int lockCount = lock.getHoldCount();
for (int i = 0; i < lockCount; i++) {
lock.unlock();
}
}
public void SetVal(int val) {
if (!lock.isLocked()) {
return;
}
lock.lock();
this.IntValue = val;
}
}
スレッドがSetVal(int val)を呼び出したい場合は、まずLock()を呼び出してからUnlock()を呼び出す必要があります。私はsetter/getterメソッドでisLocked()チェックを配置してこのルールを適用しました。そして、ロックを所有しているスレッドだけがロック解除(ReentrackLockのユニークな機能)に進むことができるように、ロック解除で追加のロック呼び出しを追加しました。オブジェクトのセッター/ゲッターはUnlock()メソッドが呼び出される前に何度も呼び出すことができます。ですから、Unlock()メソッドでは、HoldCountを繰り返し実行し、各カウントごとにロックを解除する必要があります。
これを達成するための効率的かつ慣用的な方法があるのだろうかと思いますが?
え:
これはOOPのパラダイムについて適切にそれを行うだろうかありますか?メソッドを同期させるだけです。発信者側では何もしなくてもかまいません。もっと簡単なことはありません。 – EJP
メソッド呼び出しごとにオブジェクトのロックが失われませんか?私はそれを望んでいない。私はスレッドがメソッド呼び出しのシーケンス中にオブジェクトにロックを持つことを保証したいと思います。 –
ああ、私はちょうど同期(データ)ブロックを行い、ブロック内のデータのメソッドへの呼び出しをすると、そのトリックを行うだろうか? –