一度に 1 人だけがアクセスできるリソースがある場合、サイズ 1 のセマフォを使用できますか、または単一の ReentrantLock インスタンスを使用できますか?
どちらか一方をより良い決定にする微妙な違いは何ですか?
一度に 1 人だけがアクセスできるリソースがある場合、サイズ 1 のセマフォを使用できますか、または単一の ReentrantLock インスタンスを使用できますか?
どちらか一方をより良い決定にする微妙な違いは何ですか?
違いがあります:
Semaphore
s は許可/リリースをカウントするのに適しているため、複数のリソースがある場合はLock
etal. あまり役に立ちません。ただし、保護するリソースが 1 つしかない場合は、それらで十分です。
セマフォのカウント 例: 保護されたオブジェクトがあり、同時にアクセスできるスレッドは 5 つまでに制限されています。その場合、初期値 5 のカウンティング セマフォが数学的に適合します。Downey の Little book of Semaphoresは、構造を理解するための最良の読み物の 1 つです。
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
して、同じオブジェクトがセマフォを解放したかどうかを比較することができます。