答えて
いいえ、動作に違いはありません。しかし、ウェブサイトによれば、の代わりにReentrantLock
を使用する場合があります。
- スレッドが適切に選択されるのを待ちます。
- tryLock()メソッドを使用します。
- 待機中のスレッドを中断して、何か他のことをしたいとします。
- ReentrantLockのパフォーマンスは同期よりも優れています。
これらの改善が必要ない場合は、を使用すると問題が解決しない場合があります。 the JavaDoc of the ReetrantLock classから
:
リエントラント相互排他
Lock
同じ基本的な動作と セマンティクスを持つ暗黙の監視ロックなどはなく、拡張された機能を持つ、 メソッドや文を使用してアクセス。
この例では、「拡張機能」は使用しません。メソッドと同等の代替手段としてReentrantLock
を使用します(ただし、ステートメントでは、ロックとしてthis
を使用します)。したがって、2つのメソッドは同じように動作する必要があります。
ここには、ロックにアクセスするスレッドとロックを解除するスレッドの3つの方法があります。キーワードを使用してこれらを実装してみてください。 ReentrantLock
を使用することの拡張機能と利点が明らかになります。
public class DoorLockUsingLock {
private int counter= 0;
private Thread owner= null;
private Lock l = new ReentrantLock();
private Condition notLocked= l.newCondition();
public void lockItDown() throws InterruptedException {
l.lockInterruptibly();
try {
while ((counter> 0) && (owner!= Thread.currentThread())) {
notLocked.await();
}
counter++;
owner = Thread.currentThread();
} finally {
l.unlock();
}
}
public void lockItDownUninterruptibly() {
l.lock();
try {
while ((counter > 0) && (owner != Thread.currentThread())) {
notLocked.awaitUninterruptibly();
}
counter++;
owner= Thread.currentThread();
} finally {
l.unlock();
}
}
public boolean tryLockItDown(long timeout, TimeUnit unit) throws InterruptedException {
long time = unit.toNanos(timeout);
long end = System.nanoTime() + time;
boolean success = l.tryLock(timeout, unit);
if (!success) {
return false;
}
try {
time = end- System.nanoTime();
while ((counter> 0) && (owner != Thread.currentThread()) && (time > 0)) {
notLocked.await(time, TimeUnit.NANOSECONDS);
time = end - System.nanoTime();
}
if (time > 0) {
counter++;
owner = Thread.currentThread();
return true;
}
return false;
} finally {
l.unlock();
}
}
public void unlockIt() throws IllegalMonitorStateException {
l.lock();
try {
if (counter== 0) {
throw new IllegalMonitorStateException();
}
if (owner!= Thread.currentThread()) {
throw new IllegalMonitorStateException();
}
counter--;
if (counter == 0) {
owner = null;
notLocked.signal();
}
} finally {
l.unlock();
}
}
}
これは、基本的に ''同期 ''、 ''待機 ''、 '' '通知する' 'の動作を再現します。 '' 'ReentrantLock''と' 'Condition''はセマンティクスをクリーンアップし、公平さを許容しますが、それ以外はほとんど同じです。 –
- 1. 誰もiReportについてJavaで説明できますか?
- 2. Java - マルチスレッドでの再入可能ロックの使用
- 3. 誰もJavaでスレッドが独自のスタックを実装する方法を説明できますか?
- 4. 誰でもこのコードがデータをデータベースに挿入する方法を説明できますか?
- 5. 誰も私に説明することができます、長さ、IOCコンテナを使用する方法?
- 6. Prolog誰かがこの再帰を説明できます
- 7. 誰かが最も簡単にイベントリスナーを使用する方法を説明できますか?
- 8. 誰かがsize_t型を例として使用する理由を誰でも説明できますか?
- 9. 誰かがTYPE_INPUT_METHOD_DIALOGの使い方を説明できますか?
- 10. 誰もが関数の誤解を説明できますか?
- 11. 誰もがこのプログラムを説明できますか?
- 12. 誰でもconversationThreading-jsの使い方を説明できますか?
- 13. 誰でもConcurrentLinkedListの使用方法を例を使って説明できますか?
- 14. 誰でもCodeSmith SchemaExplorer.ViewSchemaコンストラクタのパラメータを説明できますか?
- 15. 誰でもSVGポリゴンポイントを説明できますか?
- 16. 誰でもリクエストリプライブローカのzeromqの例を説明できますか?
- 17. 誰でも私のコードを説明できますか?
- 18. 誰でもasp.net 2.0のプロバイダーモデルを説明できます
- 19. 誰でもこのコードを説明できますか?
- 20. 誰でもdocker.sockを説明できます
- 21. 誰でもApacheサーバーの構造を説明できますか?
- 22. 誰でもCプログラムの出力を説明できますか?
- 23. 誰でもこの意味を説明できます
- 24. C誰でもこの構文を説明できますか?
- 25. 誰でも下記のコードを説明できますか?
- 26. 誰もstring.compare(_:options:range:locale :)を例文で説明できますか?
- 27. 誰でも私のコードをcで説明することができます
- 28. 誰かがスクリプトでスレッドを使用する方法を説明してもらえますか?
- 29. 誰かがpreg_matchをフィルタリングする方法を説明できますか?
- 30. 誰も私にこのコードを説明できますか?
これは、有用な「ReentrantReadWriteLock'''です。それは ''同期 ''で実装するのは面倒です。 –