2020 Java面接問題最新(五錠メカニズム編)

4681 ワード

ロックの原因はすべて同時問題から発生して、ここで私はただいくつかの面接の中で聞くかもしれない問題と問題の答えを書くだけで、みんなにロックのメカニズムを深く説明するわけではありません
一般的に面接官の質問は1つのポイントから1つのポイントを導入する質問なので、私はまずスレッドの問題からロックの問題に導入します.
1.スレッドセキュリティの問題について
スレッドセキュリティはマルチスレッド領域の問題であり、スレッドセキュリティは単純に1つの方法として理解できるか、または1つのインスタンスがマルチスレッド環境で使用でき、問題は発生しない.
Javaマルチスレッドプログラミングでは、Javaスレッドのセキュリティを実現するためのさまざまな方法が提供されています.
  • 最も簡単な方法は、Synchronizationキーワード
  • を使用することです.
  • java.util.concurrent.atomicパッケージの原子クラス、例えばAtomicInteger
  • を使用する
  • java.util.concurrent.locksパッケージのロック
  • を使用
  • スレッドセキュリティのセットConcurrentHashMap
  • を使用
  • volatileキーワードを使用して、変数の可視性(スレッドcacheからではなくメモリから直接読む)
  • を保証します.
    2.volatile実現原理
  • JVM最下位volatileでは「メモリバリア」を採用した
  • キャッシュコンシステンシプロトコル(MESIプロトコル)各キャッシュで使用される共有変数のコピーがコンシステンシであることを保証します.その核心思想は以下の通りである:あるCPUがデータを書いている時、操作の変数が共有変数であることを発見した場合、他のCPUにその変数のキャッシュ行が無効であることを通知するので、他のCPUはその変数を読み取る時、その無効がメインメモリからデータ
  • を再ロードすることを発見する.
    3.synchronize実装原理
    同期コードブロックはmonitorenterとmonitorexit命令を用いて実現され,同期方法(ここではJVMの下位実装を見る必要はない)は方法修飾子上のACC_に依存する.SYNCRONIZED実装
    4.synchronizedとlockの違い
    synchronizedとlockの使い方の違い
  • synchronized(暗黙的ロック):同期が必要なオブジェクトにこの制御を追加し、synchronizedをメソッドに追加してもよいし、特定のコードブロックに追加してもよいし、括弧でロックが必要なオブジェクト
  • を表す.
  • lock(表示ロック):指定した開始位置と終了位置を表示する必要があります.ロックとしてReentrantLockクラスを使用するのが一般的で、複数のスレッドで1つのReentrantLockクラスをオブジェクトとして使用する必要があります.また、ロックおよびロック解除には、lock()およびunlock()によって指摘を表示する必要がある.したがって、通常はfinallyブロックにunlock()を書き込み、デッドロック
  • を防ぐ.
    synchronizedとlockのパフォーマンスの違い
    synchronizedはJVMに管理されて実行され、lockはJava書き込みの制御ロックのコードです.JDK 1.5ではsynchronizeは性能が低い.これはヘビーレベルの操作であるため、操作インタフェースを呼び出す必要があり、ロック以外の操作よりもロックにかかる可能性のあるシステム時間が多くなる.Javaが提供するロックオブジェクトを使用するよりも、パフォーマンスが向上します.しかしJDK 1.6になると変化が起こった.synchronizeは意味的に明確で,スピン適応,ロック除去,ロック粗化,軽量ロック,バイアスロックなど多くの最適化が可能である.JDK 1.6でsynchronizeの性能はロックより悪くない
    synchronizedとlockメカニズムの違い
  • synchronizedは、もともとCPU悲観ロックメカニズムを採用していた.すなわち、スレッドが独占ロックを得た.排他ロックは、他のスレッドがブロックに依存してスレッド解放ロック
  • を待つしかないことを意味する.
  • Lockは楽観的なロック方式を使用しています.楽観ロックとは、ロックをかけないたびに衝突がないと仮定して操作を完了し、衝突に失敗した場合は成功するまで再試行することです.楽観的ロックの実現メカニズムはCAS操作(Compare and Swap)
  • である.
    そこで面接官は次の質問が鍵の質問につながる可能性があります.もちろん、前の質問が答えられず、鍵が入らない可能性もありますが、面接官が聞きたいときは自分から質問するでしょう
    5.悲観ロックについて
    悲観的なロック悲観的には、操作のたびに更新が失われる問題があり、クエリーのたびに排他的なロックが加わると考えられています.
    データを取りに行くたびに他の人が修正すると思っているので、データを取るたびに鍵をかけます.そうすれば、他の人がこのデータを取りたいと思ってロックを手に入れるまでブロックします.従来のリレーショナル・データベースでは、ロー・ロック、テーブル・ロックなど、リード・ロック、ライト・ロックなど、操作する前に鍵をかけるロック・メカニズムが多く使われています.
    6.よく使うCAS楽観ロックについて
    CASは楽観的なロック技術で、複数のスレッドがCASを使用して同じ変数を同時に更新しようとすると、そのうちの1つのスレッドだけが変数の値を更新することができ、他のスレッドは失敗し、失敗したスレッドは掛けられず、今回の競争で失敗したことを通知され、再び試みることができます.
  • CASオペレーションは、メモリ位置(V)、予想値(A)、および新しい値(B)の3つのオペレーション数を含む.メモリ位置の値が予想される値と一致すると、プロセッサは自動的に位置値を新しい値に更新します.そうでなければ、プロセッサは何もしません.いずれの場合も、CAS命令の前に位置の値が返されます.(CASの場合は、現在の値を抽出せずにCASのみが成功したかどうかを返します.)CASは、「位置Vには値Aが含まれるべきだと思います.値が含まれている場合は、Bをこの位置に置きます.そうでなければ、位置を変更せずに、この位置の現在の値だけを教えてください」と効果的に説明しています.これは実際には楽観的ロックの衝突検査+データ更新の原理と同じ
  • である.
                 ,        
    

    7.CAS『ABA』について
    CASアルゴリズムは、メモリ内のある時点のデータを取り出すことを重要な前提とし、次の時点で比較して置き換えることで、この時間差クラスではデータの変化を引き起こす
    例えば、1つのスレッドoneがメモリ位置VからAを取り出すと、別のスレッドtwoもメモリからAを取り出し、twoがいくつかの操作を行ってBになり、twoがV位置のデータをAにすると、スレッドoneがCAS操作を行うとメモリ中がAであることがわかり、後one操作は成功した.スレッドoneのCAS操作は成功したが、このプロセスに問題がないわけではない.
    一部の楽観ロックの実装はバージョン番号(version)によってABAの問題を解決し、楽観ロックはデータの修正操作を実行するたびに、バージョン番号とデータのバージョン番号が一致すると修正操作を実行し、バージョン番号に+1操作を実行することができ、そうしないと実行に失敗する.操作するたびにバージョン番号が増加するのでABAの問題は発生しません.バージョン番号が増加するだけで減少しません.
    8.楽観ロックの業務シーンと実現方式
    楽観ロック(Optimistic Lock):
  • データを取得するたびにデータが修正される心配はないので、データを取得するたびにロックは行われませんが、データを更新する際にそのデータが他の人に修正されたかどうかを判断する必要があります.データが他のスレッドによって変更された場合、データ更新は行われず、データが他のスレッドによって変更されていない場合、データ更新が行われる.データがロックされていないため、他のスレッドによる読み書き動作
  • を行うことができる.
  • は読み取り操作が比較的頻繁なシーンに適しており、大量の書き込み操作が発生するとデータが衝突する可能性が高くなり、データの整合性を保証するためにアプリケーション層は絶えずデータを再取得する必要があり、これにより大量のクエリー操作が増加し、システムのスループット
  • が低下する.
    8.スピンロックについて簡単に説明する
    スピンロックは,現在のスレッドを絶えずサイクル内で実行することによって実現され,サイクルの条件が他のスレッドによって変化すると臨界領域に入ることができる.
    再読み込み不可のスピンロックを1つのスレッドで呼び出してロックを外す場合は問題ありませんが、lock()を再度呼び出すと、スピンロックの保持参照が空になっていないため、このスレッドオブジェクトは他のスレッドがスピンロックを保持してCAS原子操作を使用していると勘違いし、lock関数はownerを現在のスレッドに設定し、元の値が空であることを予測します.unlock関数はownerをnullに設定し、予測値は現在のスレッドです.2番目のスレッドがlock操作を呼び出すと、owner値が空ではないため、最初のスレッドがunlock関数を呼び出してownerをnullに設定するまでループが実行され、2番目のスレッドが臨界領域に入ることができます.スピンロックは,現在のスレッドをループ体を絶えず実行するだけであり,スレッド状態の変化は行わないため,応答速度がより速くなる.しかし、スレッド数が増加し続けると、各スレッドが実行され、CPU時間がかかるため、パフォーマンスの低下が顕著になる.スレッドの競合が激しくなければ、ロックの期間は維持されます.スピンロックの使用に適しています
    この章のロックメカニズムについての内容は実は全面的ではありませんが、いくつかの質問があるかもしれません.
    前几期系列有心理状态篇,基础篇,集合篇,スレッド篇
    このシリーズでは、Javaベース、コレクション、スレッド、ロックメカニズム、springフレームワーク、分散、マイクロサービス、データストレージ、キャッシュ使用、メッセージキュー、セキュリティ、パフォーマンスチューニング、設計モデル、および需要分析について説明します.