スレッドの安全性について話すとき、それを解決するためにロック方法を選択します。 Java のロックのタイプは 6 つのタイプに分類されます。これは、面接で最もよく聞かれる原則とメカニズムの質問でもあります。以下に Java での一般的な面接の質問を示します。すべて答えられるか試してみましょう。
1.静的メソッドと非静的メソッドの同期エフェクトの違い
非静的メソッド:
オブジェクトをロックします(このオブジェクトのメモリをロックすると理解できます。これはこのメモリのみであり、他の同様のオブジェクトには独自のメモリ ロックがあることに注意してください)。このとき、オブジェクトの同期メソッドは複数で実行されます。他のスレッド (注: がオブジェクトです) は相互排他を生成します
静的メソッド: クラスのロックと同等 (*.class はコード領域に配置され、静的メソッドは静的領域に配置されます。このクラスによって生成されたオブジェクトはこの静的メソッドを共有するため、N 個のオブジェクトがこのメモリを競合します)、
このとき、このクラスが生成したオブジェクトが呼び出されている限り、この静的メソッドを呼び出すと相互排他が発生します。つまり、このクラスのすべてのオブジェクトはロックを共有します。
2.ロックの種類は何ですか?
(1) 楽観的ロックと悲観的ロック
(2) スピンロック&ノンスピンロック
(3) リエントラントロックと非リエントラントロック
(4) ロックレス&軽量ロック&バイアスロック&重量ロック
(5) ミューテックスロック&共有ロック
(6) 公平なロックと不公平なロック
3. スレッド同期のいくつかの方法
同期された変更
volatile は同期を実装します (可視性のみが保証され、アトミック性は保証されません)
ローカル変数 ThreadLocal を使用する
アトミック クラス (AtomicInteger、AtomicBoolean...) を使用します。
ロックを使用する
コンテナ クラスを使用します ( BlockingQueue、ConcurrentHashMap)
4. シンクロ機構とロック機構の違い
synchronized は当初、CPU ペシミスティック ロック メカニズムを使用していました。つまり、スレッドが排他的ロックを取得していました。排他的ロックは、他のスレッドがロックを解放するのを待つためにブロックのみに依存できることを意味します。
ロックは楽観的ロックを使用します。いわゆる楽観的ロックとは、毎回ロックすることなく操作を完了しますが、競合が原因で失敗した場合は、成功するまで再試行されます。楽観的ロックを実装するためのメカニズムは、CAS 操作 (比較および交換) です。
5. スレッドの安全性の問題について話す
スレッド セーフは、マルチスレッドの分野における問題です。スレッド セーフは、単にマルチスレッド環境で問題なく使用できるメソッドまたはインスタンスとして理解できます。
Java マルチスレッド プログラミングでは、Java スレッド セーフを実現するための複数の方法が提供されています。
最も簡単な方法は、Synchronization キーワードを使用することです。
java.util.concurrent.atomic パッケージの AtomicInteger などのアトミック クラスを使用します。
java.util.concurrent.locks パッケージのロックの使用
スレッドセーフなコレクション ConcurrentHashMap を使用する
volatileキーワードを使用して変数の可視性を確保します
上記は、Java のロックに関する面接の質問の紹介です。不明な知識点については、時間内に情報を見つけて解決し、ロックの内容の記憶を強化する必要があります。