122

JavaにMutexオブジェクトがありますか、それとも作成する方法はありますか? 1 パーミットで初期化された Semaphore オブジェクトが役に立たないので、質問しています。この場合を考えてみましょう:

try {
   semaphore.acquire();
   //do stuff
   semaphore.release();
} catch (Exception e) {
   semaphore.release();
}

最初の取得時に例外が発生した場合、catch ブロックでの解放によって許可が増加し、セマフォはバイナリ セマフォではなくなります。

正しい方法はありますか?

try {
   semaphore.acquire();
   //do stuff
} catch (Exception e) {
   //exception stuff
} finally {
   semaphore.release();
}

上記のコードは、セマフォがバイナリになることを保証しますか?

4

8 に答える 8

141

Java の任意のオブジェクトは、ブロックを使用してロックとして使用できますsynchronized。これにより、例外が発生したときにロックが自動的に解放されます。

Object someObject = ...;

synchronized (someObject) {
  ...
}

詳細については、こちらをご覧ください: Intrinsic Locks and Synchronization

于 2011-03-13T17:25:54.467 に答える
121

このページを参照してください: http://www.oracle.com/technetwork/articles/javase/index-140767.html

それはあなたが探しているものである(私が思うに)わずかに異なるパターンを持っています:

try {
  mutex.acquire();
  try {
    // do something
  } finally {
    mutex.release();
  }
} catch(InterruptedException ie) {
  // ...
}

release()この使用法では、成功した後にのみ呼び出しますacquire()

于 2011-03-13T17:25:50.450 に答える
30
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


private final Lock _mutex = new ReentrantLock(true);

_mutex.lock();

// your protected code here

_mutex.unlock();
于 2012-09-20T10:13:53.870 に答える
3

元の投稿の間違いは、try ループ内での acquire() 呼び出しセットです。「バイナリ」セマフォ (Mutex) を使用する正しいアプローチは次のとおりです。

semaphore.acquire();
try {
   //do stuff
} catch (Exception e) {
   //exception stuff
} finally {
   semaphore.release();
}
于 2013-03-01T05:28:23.820 に答える
1

各オブジェクトのロックは、ミューテックス/セマフォの設計とは少し異なります。たとえば、前のノードのロックを解放して次のノードをキャプチャすることで、リンクされたノードのトラバースを正しく実装する方法はありません。しかし、ミューテックスを使用すると、実装が簡単です。

Node p = getHead();
if (p == null || x == null) return false;
p.lock.acquire();  // Prime loop by acquiring first lock.
// If above acquire fails due to interrupt, the method will
//   throw InterruptedException now, so there is no need for
//   further cleanup.
for (;;) {
Node nextp = null;
boolean found;
try { 
 found = x.equals(p.item); 
 if (!found) { 
   nextp = p.next; 
   if (nextp != null) { 
     try {      // Acquire next lock 
                //   while still holding current 
       nextp.lock.acquire(); 
     } 
     catch (InterruptedException ie) { 
      throw ie;    // Note that finally clause will 
                   //   execute before the throw 
     } 
   } 
 } 
}finally {     // release old lock regardless of outcome 
   p.lock.release();
} 

現在、 にはそのようなクラスはありませjava.util.concurrentんが、Mutext の実装はMutex.javaにあります。標準ライブラリに関しては、Semaphore はこのすべての機能とそれ以上の機能を提供します。

于 2012-03-12T14:57:11.013 に答える
0

aSemaphoreがバイナリであることを確認するには、セマフォを作成するときに許可の数を 1 として渡す必要があります。Javadocにはもう少し説明があります。

于 2011-03-13T18:50:24.020 に答える