21

次の間に違いはありますか:

private Lock lock = new ReentrantLock(true);

public void getIn (int direction) throws InterruptedException {

     lock.lock();
     try {
         ...

...

public void getIn (int direction) throws InterruptedException {

      try {
          lock.lock();
          ...

コンパイルはスムーズに進み、プログラムも動作します(同じ出力を意味します)

lock.lock(); を入れるべきですか?試す前か後か…

助けてくれてありがとう

4

4 に答える 4

24

lockそれが であると仮定すると、チェックされた例外をスローしないReentrantLockため、実際の違いはありません。lock()

ただし、Java のドキュメントでは、例のブロックのlock()外に出ています。これは、未チェックの例外が誤って呼び出されないようにするためです。何よりも未チェックの例外が存在する場合に正確さが問題になるかどうかは、まったく別の議論です。tryReentrantLocklock()unlock()lock()

try一般に、ブロックのようなものを可能な限りきめ細かく保つことは、適切なコーディング プラクティスです。

于 2012-06-03T06:53:22.497 に答える
10

ケース No 1 の場合は、finally単に と言うことができますunlock()。No2 の場合、 の前unlock()にロックを保持しているかどうかを確認する必要があります。IllegalMonitorStateException

于 2012-06-03T07:05:26.460 に答える
6

try ステートメントには次も含まれます。

 } finally {
     lock.unlock();
 }

つまり、 のlock.lock()tryに配置すると、 によってスローされた例外によって lock.lock()が発生 しますがlock.unlock()、これは間違っています。ロックが取得されず、ロックを解除すると別の例外が発生するからです。したがって、最初のバリアントは正しいです。スローされた例外を処理するlock.lock()には、別の try ステートメントを使用する必要があります。

于 2012-06-03T06:56:28.917 に答える
0

最初のケース: lock.lock()throwsの場合InterruptedExceptiongetInそれを管理します。ただし、他の例外の場合は、次のgetIn処理を行わない例外がスローされます: Runtime Exception

2 番目のケース: とは別にInterruptedExceptiontry-catchブロックはいくつかの例外処理も行っていますが、ここでは示していません。内側のブロックもいくつかの例外をキャプチャしているため、これはより少ない例外をスローするはずです。

lock.lock()全体的な実行は、スローされる例外によって異なりますか?

于 2012-06-03T06:47:23.590 に答える