Lock
と Synchronized
は両方とも、スレッド セーフティの問題を解決するために Java で使用されるツールです
Synchronized
は Java の同期キーワードであり、Lock は J.U.C パッケージで提供されるインターフェイスであり、このインターフェイスには、ReentrantLock などの重要なものを含む多くの実装クラスがあります。ロックを実装するために、Synchronized は 2 つの方法でロックの強度を制御できます。
1 つは、メソッド レベルで synchronized
キーワードを変更することです。 1 つ目はコード ブロックを変更することです。ロック オブジェクトのライフ サイクルを通じてロックのスコープを制御できます。ロック オブジェクトが静的オブジェクトまたはクラス オブジェクトの場合、ロックはグローバル ロックです。ロック オブジェクトが通常のインスタンス オブジェクトである場合、ロックのスコープはインスタンスのライフ サイクルによって決まります。Lock におけるロックの粒度は、lock() メソッドと unlock()
によって決まります。その中で提供されるメソッド
lock() メソッドと unlock() メソッドの間のコードは次のことができます。スレッドの安全性を確保し、ロックの範囲は Lock インスタンスのライフサイクルによって異なります。 Lock は Synchronized
よりも柔軟です。Lock は、いつロックするか、いつロックを解放するかを個別に決定できます。必要なのは、lock() メソッドと lock メソッドを呼び出すことだけです。Lock は、ノンブロッキングの競合ロック メソッドも提供しますは tryLock()
と呼ばれます。このメソッドは、true/false を返すことで、他のスレッドがすでにロックを使用しているかどうかを現在のスレッドに伝えることができます。また、Synchronized はキーワードであるため、ノンブロッキングを実装することは不可能です。競合ロック方式。Synchronized
ロックの解放は受動的です。同期コード ブロックの実行が完了した後、またはコード内で例外が発生した場合にのみ解放されます。ロックは公平なロックを提供します。不公平なロックの仕組み 公平なロックとは、スレッドがロック リソースをめぐって競合するときに、他のスレッドがすでにキューに登録されているか、ロックが解放されるのを待っていることを意味します。その場合、現在ロックをめぐって競合しているスレッドはキューに飛び込むことができません。スレッドがロックのキューにある場合、スレッドはロックをめぐって競合しようとします。同期は不公平なロックの実装のみを提供します。 3. パフォーマンスの観点から見ると、
はパフォーマンスの点ではロックとあまり変わりませんが、実装にはいくつかの違いがあります。 ロックの最適化を達成するために、バイアスされたロック、軽量ロック、重量ロック、ロック アップグレード メカニズムを導入し、Lock はパフォーマンスの最適化を達成するためにスピン ロックを使用します
以上がJavaにおけるロックと同期の違いは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。