1.リエントラントロックの概要
たとえば、リエントラントロックとは何ですか
これで、ロックオブジェクトロックができました。メソッドAの呼び出しで、ロックされています。
ロック後、メソッドAでメソッドBが呼び出され、メソッドBがロックされてロックされます。
再入可能ロックでない場合、メソッドAのロックロックはまだ解放されていないため、メソッドBを呼び出すときにデッドロックが発生します。
再入可能なロックの場合は、Bメソッドを直接実行できます。同じスレッドでロックが取得されると、これを理解する必要があります。
スレッドの後続の実行にもこのロックが必要なので、直接使用できます
参照について詳しく知りたい場合:https://blog.csdn.net/yanyan19880509/article/details/52345422次に、関連するソースコードを自分で確認してください。
synchronizeとReentrantLockおよびサブクラスを除いて、その他は再入可能ではありません。もちろん、AQSの助けを借りて、自分で再入国ロックを実装することができます
2.ロックロックテスト
次のようにIndexControllerにコードを追加します
@RequestMapping({"/hello"})
@ResponseBody
public String hello(){
//获取一把锁,只要名称一样就是同一把锁
RLock lock = redissonClient.getLock("my-lock");
//加锁 没加上锁的线程阻塞式等待,不用我们之前那样写的自旋
lock.lock();
//模拟业务执行
System.out.println("加锁成功,业务执行中,执行线程为:"+Thread.currentThread().getId());
try {
Thread.sleep(30000);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
//释放锁
System.out.println("释放锁,执行线程为:"+Thread.currentThread().getId());
lock.unlock();
}
return "hello";
}
ブラウザは、このメソッドにアクセスするために2つのウィンドウを同時に開きます
ブラウザに次のように表示されます。1つのスレッドがロックを取得し、ビジネスを実行してからロックを解放すると、別のスレッドが同じ操作を実行します。ロックを取得していないスレッドはブロックされ、ロックが解除されるまで待機します。リリースされました。
上記はロックの基本的な機能です。前のセクションで述べたように、突然のダウンタイムや停電ロックが解除されない、ロックが取得される、原子性の問題が解除されるなどです。
Reddisonには解決策がありますか?簡単なテスト
現在、ロックが追加され、ロックが解放される前にロックが解放されると、スレッドがクラッシュする問題をテストしています。クラッシュ後にロックが解放されない場合、自然にデッドロックが発生します。
アプリケーション構成をコピーし、ポートを変更してから開始します
2つのサービスを開始した後に訪問する
このとき、ポート10201のサービスのロックが取得された後、サービスは停止します。
10200サービスのロックを引き続き取得できることを確認して、通常どおりビジネスを実行し、ロックを解除します。
ダウンタイム後にロックが解除されることを説明します。デフォルトの有効期限があるはずなので、サービスが停止するとロックが解除されます。それ以上に、私は信じています。
ロックの取得とロック解除操作のアトミック性もロックの下部に実装されており、ビジネスに時間がかかる場合は、ビジネスが実行される前にロックが自動的に解放されることを心配する必要はありません。 10秒ごとに自動更新されます。
次のセクションでは、基礎となるコードがどのように実装されているかを確認します