5

一度に 1 人だけがアクセスできるリソースがある場合、サイズ 1 のセマフォを使用できますか、または単一の ReentrantLock インスタンスを使用できますか?

どちらか一方をより良い決定にする微妙な違いは何ですか?

4

4 に答える 4

7

違いがあります:

  1. セマフォは、あるスレッドによって取得され、別のスレッドによって解放されます。このようにして、1 つのスレッドが別のスレッドにシグナルを送ることができます。カウント 1 のセマフォは、相互排除にも使用できます。一方、ロックは相互排他のためにのみ使用されます。
  2. セマフォは再入可能ではありません。これは、同じスレッドがセマフォを獲得したとしても、パーミットが使い果たされるとスレッドがセマフォを獲得できないことを意味します。ロックは再入可能です。
于 2013-03-28T10:28:04.063 に答える
1

Semaphores は許可/リリースをカウントするのに適しているため、複数のリソースがある場合はLocketal. あまり役に立ちません。ただし、保護するリソースが 1 つしかない場合は、それらで十分です。

于 2013-03-28T10:16:57.747 に答える
0

セマフォのカウント 例: 保護されたオブジェクトがあり、同時にアクセスできるスレッドは 5 つまでに制限されています。その場合、初期値 5 のカウンティング セマフォが数学的に適合します。Downey の Little book of Semaphoresは、構造を理解するための最良の読み物の 1 つです。

于 2013-03-28T10:22:16.970 に答える
0

synchronizedこれは両方で実行できることは事実ですが、Semaphore最初にこのリソースをどのように使用するかを理解する必要があります. これを使用する場合synchronized、スレッドでの同期を監視する必要があることを意味します。

public void run() {
  // some code
  synchronized (resource) {
    // use resource
  }
}

スレッドにこれを監視させたくない場合 (私の意見では、その方が良いと思います)、Semaphoreリソースの getter メソッドで使用します。

public Resource acquireResource() {
  // acquire semaphore
  return resource;
}

public void releaseResource() {
  // release semaphore
}

スレッドで次のようにします。

public void run() {
  // some code
  Resource resource = ResourceContainer.getResource();
  // do something with resource
  releaseResource();
}

これらのメソッドにパラメーターを追加Objectして、同じオブジェクトがセマフォを解放したかどうかを比較することができます。

于 2013-03-28T10:30:59.847 に答える