方言話同期、CAS原則の基礎となる、ロックロックとロック・プロモーション・原則

               目录

               1、乐观锁和悲观锁的概念

               2、synchronized底层的原理

               3.  CAS的原理

               4.  并发包下Lock锁和synchronized对比

               5.  锁升级原理
复制代码

みなさん、こんにちは、私Ninetowns 4つの最もHaohengの小さな耳。

今日は、お国言葉同期、CAS基礎となる原則、ロックロックとロック・プロモーション・原則に話に来ます。

1、楽観と悲観的ロックのコンセプト

変数は、この変更時に変更されるなどのスレッドが、それはこの期間中に他のスレッドが、そう、この変数を変更し、その変更の際に、ないことを確実にするために、変数のロックにそれを追加することも可能であることは悲観的な心理学でありますスレッドには、この変数を訪問することを行くことができません。このロックは、悲観的ロックです。ヘビー級悲観的ロックは、synchronizedキーワードを代表して、オブジェクトをロックされています。

この変更の際に、変数を変更するなど、スレッドは、それがこの期間中に他のスレッドが、それは変更操作であるかもしれないので、この変数を変更するために、変数に追加しますないことを、心理的な楽観的ですロック。このロックは楽観的ロックです。オプティミスティック・ロックは、オブジェクトCASに代わって、軽量ロックです。

原則2、同期基礎となります

まず第一に、私たちはコンセプト--monitorを知っておく必要があります。

各オブジェクトは、ゼロから出発して、カウンタを有し、内部モニター、モニターを有しています。

このスレッドはロックモニタを取得したい場合は、最初の0の場合、モニタカウンタは誰もロックを獲得しない、スレッドがロックを取得し、その後、カウンタ一つができる示し、0でない判定し、0でない場合、説明がされています他のスレッドは、スレッドが待機をブロックする必要があり、ロックを獲得しているがあります。

基本原理と同期して両者の間に、JVMのコマンドおよびモニターです。

一般的にオブジェクトロックに同期した、ロッククラスは、クラスオブジェクトロックです。コンパイルの基礎となるJVMの命令にsynchronizedキーワードを使用している場合は、2つのmonitorenterとmonitorexit指示があるでしょう。同期コードセグメントへのスレッドは、monitorenter命令実行監視カウンタは、他のスレッドがモニタカウンタが0ではないが見つかりました、それは待機ブロックされているように、1だけインクリメントされます。

同期コードセグメントスレッド、monitorexit命令の実行は、他のスレッドがモニタカウンタは、ロックは、その後、ビジネスロジックの実行カウンタをインクリメントし監視するために、取得し、することができ、0で見つかったように、1だけカウンタを監視することです。

上記同期オブジェクトの基本原理である、クラスがロックされました。

同期方法かどうかを決定する、コマンドを監視しないことによって、しかしACC_SYNCHORNIZEDキーワードによるロック方法。

3. CAS原則

CAS、Conmpareとスワップは、英語では「比較交換。」に変換します これは、最初のステップは、値、第2段階の比較値は、独自の値を見て読んで、そしてだけ異なって読み取ることで改正に、自分のと同様の読み取り値と、第三のステップは、変更することである、3段階のプロセスです。

CASの実装クラスは、最も古典的なのAtomicIntegerです。

例えば、のAtomicIntegerプラス1、スレッド上で読むために2つのスレッドが古い値が0である、Bのスレッドが古い値が0で読み、Aはその後、より多くの価値をCAS操作を実行し、その値は、自分自身がすべて、同じを読んでいBスレッドがCAS操作、より多くの価値を実行し、値がちょうど自分の読み取りは同じではないが見つかりました、1となり、それは古い値を再読み込み、古い自分のメモリと同等であり、0であり、それは1の値を変更します1の値、その後、CAS動作を継続。

あなたが1つのスレッドだけCASを実行することができ、同じ時間を保証されている原子の下に、ハードウェアレベルでのCASは、最初のセットを比較し、失敗します。この時点で実行すると同時に他のスレッドをCAS。

CASは、バグの問題は、ABAの空気の循環を生じる可能性があります。あなたはABAの問題を解決したい場合は、それはABAの問題を解決するために、同様の方法で内部バージョン番号を作成し、AtomicStampedReferenceクラスを使用することができます。

4.ロックとの契約と比較同期をロック

私は2つの主な違いは、次の4点だと思います。

1.まず、同期されているJavaは組み込みのキーワード、JVMレベルは、ロックは、Javaクラスで、JDKレベルです。

2.synchronizedロック状態を取得するか否かを判断することができない、ロックは、ロックを取得するかどうかを決定することができます。

3.synchronized自動的に最終的には手動で、または可能性が高い原因のスレッドのデッドロックに、ロックを解除して(ロック、アンロック()メソッドを解放するために)ロック、ロックの必要性を解放します。

符号同期の問題を少量のロックを同期質量同期同期コード適し4.Lockロック、。

5.ロックのエスカレーション原理

ロックフリー状態として始まった、ロック、ロックがあれば出て行くだろう判断に来る、そして非常にサポートをロックバイアスされているロックの始まり。現在のリソースを取得するには、このスレッドロックをロックバイアスされ、私はそれがロックに取得していない場合は、その後、彼が行くようにロックを取得し、軽量にアップグレードする優先権を与えるだろう、CASはその楽観的ロックをロックし、楽観的ロック比較する時間との交換プロセスであり、成功していないならば、それは彼がいることを保証するであろう、その場合には、一定数に同期したスピン、後に、このようなヘビー級ロックにエスカレートする前に、それはスピンになりますパフォーマンスの問題あなたは、このようなヘビー級のロックを開始同期と思われる場合、そのパフォーマンスは比較的貧弱です。

                        End
复制代码

Haoheng少し耳、Haohengプログラマー:著者について。私は、ビジョンとテクノロジーの世界Haohengの誰もが、技術の世界を見てみたいです。次のFanger魏コード、持続的注意をスキャンするためにようこそ、オリジナルシリーズの大きな波が道を進んでいます

おすすめ

転載: juejin.im/post/5e685ba7f265da57685dd3f7