ロックと同期は、共有リソースへのアクセスを制御するために使用される最も一般的なロックです。ロックは、同期の代わりには使用されませんが、同期が要件を満たしていない場合に、より高度な機能を提供するために使用されます。Lockインターフェースの一般的な実装クラスは、ReentrantLockとReadWriteLockです。
同期の欠点については、前のセクションを参照してください。
- ロック効率が低い
- ロック解除はほとんどありません。同期モニターロックは、メソッドまたはコードブロックが正常および異常に終了すると、ロックを解放します。
- ロックを取得しようとするときにタイムアウトを設定することはできません。ロックを取得しようとしているスレッドに割り込むことはできません。
- 柔軟性が不十分です。
読み取り/書き込みロックと比較して、ロックと解放のタイミングは単一です。各ロックには単一の条件(オブジェクトのロック)しかないため、十分でない場合があります。 - ロックが正常に取得されたかどうかを知る方法はありません。
たとえば、LockのtryLockメソッド
1ロックインターフェース分析
public interface Lock {
// 获取锁
void lock();
// 获取锁时可以被中断
void lockInterruptibly() throws InterruptedException;
boolean tryLock();
// 超时就放弃
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
// 解锁
void unlock();
Condition newCondition();
}
- 同期などの例外が発生した場合、ロックはロックを解放しないため、ロックが解放されるようにするには、最後にロック解除を呼び出す必要があります。
- lock()メソッドは中断できません。デッドロックされると、永続的な待機状態になります。
- tryLock()は、ロックの取得を試みるために使用されます。現在のロックが他のスレッドによって占有されていない場合、ロックは取得されてtrueを返します。それ以外の場合は、falseを返します。メソッドはすぐに戻り、ロックが使用できない場合でも待機します。
tryLockコード仕様、コメントを参照
Lock lock = new ReentrantLock();
if(lock.tryLock()) {
try {
} finally {
lock.unlock();
}
}
Lockを待機している間、スレッドはWAITING状態にあり、BLOCKEDすることはできません。
2ロックの視認性保証
ロックの可視性は同期の可視性と同じです。発生前の原則を参照できます。ロック解除操作は、後続のロック操作に表示されます。
ロックとロック解除は、メモリの相互作用操作でロックとロック解除の操作を調整します。
3デモンストレーションの例
この記事のケースコードの場所:https://gitee.com/dtyytop/advanced-java