ホームページ >Java >&#&チュートリアル >Java のロック API の概要
共有リソースへのアクセスを管理することは、同時プログラミングにおいてデータの一貫性を確保するために重要です。従来の同期キーワードには、公平性、すぐにロックを取得する、特定の時間までロックを取得するなどの複雑なシナリオに対する柔軟性がありません。これらの制限に対処するために、Lock、ReadWriteLock、および StampedLock API が Java 1.5 で導入され、開発者が処理するための優れた制御を提供します。共有リソースへのアクセス。これらは java.util.concurrent パッケージの一部です。
Lock API はインターフェイスであり、スレッドの同期を処理するための以下のメソッドを提供します。
リエントラントロック
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
ReadWriteLock API はインターフェイスであり、読み取りおよび書き込みシナリオを維持するためのロックのペアを維持します。書き込み側が存在しない場合、読み取りロックは複数のスレッドによって同時に保持される可能性があります。書き込みロックは排他的です。
重要なルール
例: マイクロサービス通信で、サービス B がサービス A からの JWT を期待しているとします。JWT はサービス A によって生成され、数分間キャッシュ可能です。このシナリオでは、ReentrantReadWriteLock の方が便利です。トークンの有効期限が切れているか、期限切れが近づいている場合は、トークンを更新できます。読み取り不足を避けるために、ここでは読み取りロックを取得していません。
ReentrantLock lock = new ReentrantLock(true); //fair lock public void methodExecution() { lock.lock(); try { // Critical section here } finally { lock.unlock(); } }
StampedLock は Java 8 で導入されたクラスです。 3 つのロック モードをサポートし、ロックを解除するために使用されるスタンプを返します。ロックのアップグレードが可能になります。
キーポイント:
String jwt = JwtUtil.generateJwt(); ReadWriteLock lock = new ReentrantReadWriteLock(); Lock writeLock = lock.writeLock(); Lock readLock = lock.readLock(); public String getJwt(String key, String value) { if (StringUtils.hasLength(jwt)) { if (JwtUtil.isJwtEligibleToRenew(jwt)) { generateJwt(); } } else { generateJwt(); } return this.jwt; } public void generateJwt() { this.writeLock.lock(); //write lock try { if (JwtUtil.isJwtEligibleToRenew(jwt)) { this.jwt = JwtUtil.generateJwt(); } } finally { this.writeLock.unlock(); //release write lock } }
楽観的な読み取りの例。これにより、スレッドは従来の読み取りロックを取得せずに読み取ることができるため、ロックの競合が回避され、パフォーマンスが向上します。オプティミスティック読み取りロック時間を取得した後に書き込みロックが取得された場合、 validate() は false を返します。それ以外の場合は true になります。
public void readAndWrite() { long l = this.stampedLock.readLock(); try { //critical section } finally { this.stampedLock.unlock(l); } long w = this.stampedLock.writeLock(); try { //critical section } finally { this.stampedLock.unlock(w); } }
コーディングと学習を楽しんでください !!!
ご質問がございましたら、コメントしてください。
以上がJava のロック API の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。