あなたがより明確に考えさせるここから大型ヘッドは、ロックのさまざまなを作ります

個人のブログ

個人のブログ

私たちはロックを見て、この時間

私たちはしばしばロックでの生活を考えるロックといえば、私たちの日常生活の中で私たちはしばしばロックと接触します。たとえば、私たちの携帯電話のロック、コンピュータのロック、私たちの生活のロックの別の例は、これらはロックされています。

何役割ロック?

最後にロックがまだ使用が何であるかを知らないと言いましたか?私たちが携帯電話のロックを使用して、我々はロックを使用する必要がなぜ熟考する必要がある私たちのプライバシーを保護することです、私たちのために私たちの財産は、安全で正確な保護するためにロックを使用して安全ロックを使用することです。
だから、私たちの生活の中でそれが何を使用するJavaでそれをロックし、彼らのプライバシーや財産の安全を守るためにロックすることができますか?

ロックでのJava

ロックにおけるJavaは、安全性を確保するためにも正確ですが、違いは、並行性を確保するために必要とされるJavaロックです。だから、正確には、Java並行処理でロックされている問題の3種類をご注文の際には、安全性を確保するために、だけでなく、メモリの一貫性を解決するために、アトミックです。Javaでのロックを幅広く提供しています、各ロックは独自の特徴と適用範囲を持っています。だから我々は、ロックおよび使用する権利の原則との違いに精通している必要があります。

楽観と悲観的ロック

ペシミスティック・ロック

楽観と悲観的ロック、そして彼は、あなたがそれを、ご紹介し直し関連の記事を書いたとき、私は書き始めた直前に。
名前は、それは悲観的で暗示するように、それはデータへのすべての時間アクセスを感じた悲観的ロックは、変更するために他の人(スレッド)である可能性が高いので、訪問の時にそのリソースを確保するために、このようにリソースにアクセスする際には、リソースのロックになりますこれは、他のスレッドによって変更されることはありません。これはケースで、その後、他のスレッドがリソースへのアクセスをしたい現在のスレッドが取得した後にロックを解放するまでにのみブロックすることができます。Javaでの実装では悲観的ロックされているsynchronized关键字Lock実装クラスは悲観的ロックです。私たちは、最終的には悲観的ロックを実行する方法です見て。

スレッドB後のスレッドが障害物に巻き込まれたリソースを押収して、リソースを解放するために、スレッドAのを待ちます。

スレッドスレッドBのリリースでは、リソースを終了すると悲観的ロックが同時にリソースに1つだけのスレッドが動作することを保証し˛動作してリソースを開始するためにロックを取得するために行ってきました。

オプティミスティック・ロック

(それは楽観的であるので)誰かがデータ変更にアクセスする際に悲観的ロックとは対照的に、楽観的ロックは、リソースにアクセスするとき、それは、ロックしていないと感じていませんが、時間でそれは誰かが変わるかどうかを判断するために戻って提出しましたデータベース内の現在のデータは、我々が使用することができますversion実現するために、バージョン番号を。Javaでは、私たちは、達成するためにCSAを使用しています。私たちは楽観的ロックの実行を見て

CAS

CAS(コンペア・アンド・スワップ)のアルゴリズムは、Javaが提供するロックフリー、非ブロックアトミック操作のためのアルゴリズムです。ロックを使用せずに、マルチスレッド同期の下で。そして契約(java.util.concurrentの)CAS原子クラスで楽観的ロックを実装するために使用されています。CASハードウェアは、安全でないこのクラスは、ここに行くことはありません、更新の比較原子は、JDKコンペア・アンド・スワップ*危険で一連のメソッドを提供していることを確認します。
CAS動作手順二つの値は、新しい修正値の値に等しい、またはそれを行っていない場合は、期待値と修正するメモリ内のデータであるCASは、3つの動作値を必要と動作しています。

  • Aの期待値
  • メモリV
  • Bを変更されます

    等しくない場合は、単純な、CASは、それらが等しい場合、ループメモリにおける期待値と値が等しい判断、無限ループであり、その後、修正の実装は、それが正常終了の実装後までのサイクルに続きます。

    CASの問題

    非常に高速なハードウェアが、CASが、それは、このようなABAの問題などいくつかの問題があり、例えば、今、共有メモリ変数Xを持っているが、この時は、変数Xの値を変更したい変数の出現は、最初に取得します今回取得した値Xは、その後、CAS操作変数XがBに変更されています このように問題はないと思われる、スレッド変数X 1以降に取得した場合、共有変数の実装の最終的な結果が、2 Xは、AにBに変更した後、CAS動作を実行し、修飾されたスレッドのCAS値の実装前に現れていることこのしかし、の値は1が得られたスレッドではありません。
    これは、ABAの古典的な問題です。状態変数値はサイクロコンバータ、B、BとC、このような問題が発生しない場合に、AすべきB、Bに月を持っているので、ABAの問題が発生します。

    ソリューション:JDK1.5はABAの問題を回避するために、各変数のためのタイムスタンプを追加するためのAtomicStampedReference方法に入社した後。
    それが予想されるサイクル同等の変更やメモリまで成功していますので、同時に、大きなループのオーバーヘッドCASの問題があります。同時に、唯一の原子問題に共有変数が保証することができますが、オブジェクト間のアトミック参照を確実にするためにJDK1.5後AtomicReferenceクラスを追加しました。

    悲観的ロックと楽観的ロックを使用します

アトミックパケットタイプを提供あなたはsynchronizedキーワード悲観的ロックを実装するために使用することができる、と楽観的ロックの方法を用いてもよいです。

公正かつ不公平なロックロック

彼は楽観と悲観的ロックロックを言うと、今公正かつ不公平ロックロックを見て。公正かつ不公平ドロップされるロックでは、公正は、その複数のスレッドが同時にキューにスレッド、その後、アプリケーションロックの申請重点はレベルの競技場の上でその名前をロックし、キューの最初は、キュースレッドを入力しますロックを取得するためのリソース、重点は最初の務め来る最初にあります。例えば、我々は米はできるだけ早くマークすることができるので、私は私のクラスメートを覚えているタイムアップすばやく食堂ラインに直行したときに学校のカフェテリアでDafan、となりプロセスキューとご飯を食べることができない誰も、この時間内食堂のおばそれは公正である、誰もキューイングの言葉は、あまりにも、スレッドをご飯を食べることができるため。不当なロックが理解することができ、私のカフェテリアラインアップDafanまでの学生が、一部の人々はキューをジャンプすること、食堂の叔母は公平ではない、あなたはガスがない不公平ではないと言う、Dafanの人々は彼にまっすぐに与えていないキューをジャンプします主な非資本計画は、必ずしもロック先着ではありませんスレッドのみがブロックされますキュー内の他のスレッドからリソースを取得するときにでも公平ロックは、欠陥があるので、公正ロックCPUは非公平ロックよりもはるかに少ない効率的です。CPUのオーバーヘッドがスレッドをブロックされているので非公平ロックよりも大きな目を覚まします。例を見て:

JavaのReentrantLockのロックで公平かつ達成不公平なロックを提供します。公正かつ不公平ロックロックを達成するためにどのようにReentrantLockの外観

フェアや不正利用のロックロック

:ReentrantLockのデフォルトのロックが不公平である、のはフェアロックの例を見てみましょう

出力を見て:

私たちは、来る出力が公正ロックの順である参照先着ことができます。
非ロック公正例を見に:

出力:

最終出力は全く秩序がない場合、必ずしも最初の最初に来ていない非公正ロックならば、我々は結果を見ることができるには、基礎を務めました。
それでは、要求がロックを取得するために、2スレッド、その後、スレッド1つのリリースロックを待機してハングアップします、ロックでロックし、スレッド1 GET 2後公正ロック・スレッドを使用した場合。私たちは、ロックを要求しているスレッドを持つようにしたい場合は、使用している場合、この時点で3、非フェアロックは、スレッド2及び3は、2つのスレッドが唯一のスレッド3を一時停止することができます公正なケースをロックし、ロックを取得します持っていますスレッド2を待機した後、取得したロック解除のリソースを取得。

不公平公正ロックとロックを使用する場合

シナリオの下で公正使用は、公正に特別な公正なら、ロックはパフォーマンスのコストので公正もたらす、非ロックを使用しようと、フェアロックリソースを必要とします。

排他ロックと共有ロック

排他的と共有シンクタンクを参照してくださいだけでReentrantLockの上、もう一度ロックを獲得するために、ロックを解除し、他は唯一のロックリソースのスレッドを取得するために、現在のスレッドを待つことができながら、一つのスレッドだけが、ロックリソースを占有することができます排他ロックのために何を、排他ロックである、排他ロックがそれに悲観的ロックではないように見えるでしょうか?そのため、悲観的ロックの後にのみ、再びロックリソースを取得することができます別のスレッドのリリースを待つことができますリソースをつかみます。正確な事実排他ロックも悲観的ロックであると言うこと。
共有ロックの話を、共有ロックは、複数のスレッドが同時にロックを取得できるようにする政策を緩和し、実際に楽観的ロックロックです。そして、ReadWriteLockでの契約は、一般的な共有ロックです。それは同時に両方の複数のアクセス、またはアクセスを読み取ることができ、リソースが書き込み動作だったことができますが、ではありません。

スピンロック

実際にはスピンロックスピンロックとは何か、スレッドがロックを取得するときに、ロックが他の人に取得されているので、このスレッドは、すぐにハングアップしませんが、CPUを使用する権利を放棄せずに再取得しようとしますロックリソースは、デフォルトの数は10である、あなたは-XXを使用することができます。PreBlockSpinshは回数を設定します。スピン・ロックが長すぎるためにロックを取得した場合にリリースCPUリソースの枯渇の背後にあるスレッドの原因となります。スピンロックは公平ではありません。

利点

スピンロック状態は、スレッドスイッチは、ユーザモードであった起こることはない、すなわち、スレッドがアクティブになっている、不要なコンテキストの切り替え、高速実行を減少、遮断状態に入るようにスレッドを引き起こしません。

生命の予期しない条件のすべての種類がありますが、Javaはまた、予期せぬ異常の様々なを持って、我々は異常なのJavaについて話す次回は、懸念を転送するために歓迎します

おすすめ

転載: www.cnblogs.com/Scramblecode/p/11570608.html