アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

知っているほど、知らない

序文

前回、楽観的ロックと悲観的ロックについて触れたとき、ロックには多くの種類があることがわかっています。フェアロックとアンフェアロック、およびそれらのコードでの実践について簡単に説明しましょう。

テキスト

チャットを開始する前に、2つの定義について簡単に説明し、確認したり、理解したりできるようにします。

フェアロック:複数のスレッドは、ロックを適用する順序でロックを取得します。スレッドはキューに直接入り、キューに入れられます。常に、キューの中で最初にロックを取得します。

  • 利点:すべてのスレッドがリソースを取得でき、キューで飢えて死ぬことはありません。
  • 短所:キュー内の最初のスレッドを除いて、スループットが大幅に低下し、他のスレッドがブロックされ、ブロックされたスレッドをウェイクアップするcpuのオーバーヘッドが非常に大きくなります。

不公平なロック:複数のスレッドがロックを取得すると、直接取得しようとします。取得できない場合は待機キューに入り、ロックを取得できる場合は直接取得します。

  • 利点:CPUがスレッドをウェイクアップするオーバーヘッドを削減でき、全体的なスループット効率が高くなり、CPUがすべてのスレッドをウェイクアップする必要がないため、呼び出されるスレッドの数が減ります。
  • 短所:これにより、キューの途中のスレッドがロックを取得できなくなったり、ロックを長時間取得できなくなったりして、飢餓状態になる可能性があることも発見した可能性があります。

わかりやすい例を挙げましょう。数日間考えてみたところ、昨日の前日に三ワイと一緒に朝食を買いにKFCに行ったときに、ようやく例をあげる方法を見つけました。

朝食の時間です。アオビンは朝食にKFCに行きたがっていて、人が多いことに気づきました。あまり考えなかったので、素直に列の最後に行ったので、みんな公平に感じました。先着順なので、これは公平なロックです。少し。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

不公平なロックは、アオビンが朝食を買いに行って、みんなが列に並んでいるのを見つけたということですが、アオビンは少しスカムで、列に飛び込むのが好きだったので、最初のものに直行しました。後ろの卵と米豆はすべてでしたいいえ、私は飛び込んで何も言うことを敢えてしませんでした、私はそれを黙って耐えることしかできませんでした。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

でもたまに卵が上がって、ロールバックして並んでほしいと言われたり、いじめたり、苦労したりするのが怖くて、黙って列に並んでいると、飛び込んで失敗しました。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

簡単な例を紹介した後、あなたは言うかもしれません、Zhabing、私もこれを知っています。

実際の実装に戻る必要がありますか?実際、ReentrantLockには、誰もがよく使用する関連する公正なロックと不公正なロックがあります。

楽観的ロックと悲観的ロックの章で述べたSyncクラスをまだ覚えていますか?これはReentrantLock自体の内部クラスであり、AbstractQueuedSynchronizerを継承します。ロックで操作する操作のほとんどはSync自体によって実装されます。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

Syncには、FairSyncとNofairSyncの2つのサブカテゴリがあります。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

サブカテゴリの名前は名前で確認できますが、公平性と不公平性はコードレベルにどのように反映されていますか?

フェアロック:
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

彼がhasQueuedPredecessorsの判断を追加したことがわかりますが、彼の判断は何ですか?
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

コードの一般的な意味は、現在のスレッドが同期キューの一番上にあるかどうかを判別することです。一番上にある場合はtrueを返し、そうでない場合はfalseを返します。

私はいつもこれでほぼ完了するはずだと思っていますが、座って静かに考えたところ、まだ何かが足りないことがわかりました。

前回ReentrantLockについて話しましたが、AQSなどについて触れました。スレッドが入ると、処理リンク全体はどのようになりますか?

フェアロックは公平ですか、それとも不公平ですか?BingbingをフォローしてReentrantLockの内面を見てみましょう。

上記で多くのことが言及されているので、ある程度理解しておく必要があると思います。スレッドがReentrantLockに入ったのはなぜ不公平なのですか?(デフォルトは不公平なロックです)

あなたが詳細を理解するのを助けるために最初に絵を描きましょう:

ReentrantLockの同期はAbstractQueuedSynchronizerを継承します。これは、私たちがよくAQSと呼ぶものです。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

彼はReentrantLockのロックとリリースロックのコアでもあります。前号で一般的な内容について説明しましたが、あまり繰り返さないでください。ロックのプロセスを見てみましょう。

スレッドAは、ロックを取得する準備ができています。最初に、状態の状態を判断して0であることが検出されるため、CASは成功し、現在ロックを保持しているスレッドはそれ自体として変更されます。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

このとき、Bスレッドもやって来て、最初に状態状態を判断するために上がって、1だったので、CASが失敗しました。本当に運が悪かったので、素直に待ち行列を待ち、目覚めるのを待ち、最初に寝ます。 。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

Aさんは長い間持っていて少し疲れていたので、ロックを解除して他の人にチャンスを与える準備ができたので、状態を変えてロックを持っている糸の跡を消し、Bを起こす準備をしました。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

このとき、緑色の帽子をかぶった少年Cがやって来て、状態が0であることを知り、CASを1に決定的に変更し、現在ロックを保持しているスレッドも変更しました。

スレッドBはAによって起こされてロックを取得し、状態が1であり、CASが失敗したため、待機キューに戻ることしかできませんでした。ルートは、Aのスカムバッグ、自分を欺く方法、自分の気持ちを欺く方法を叱るのを忘れませんでした。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

上記は不公平なロックスレッドです。この場合、Bのようなスレッドが長時間リソースを取得できない可能性があります。一部のスレッドは待機時間を短縮して使用率を向上させることができるという利点があります。

現在はデフォルトで不公平です。公平にしたい場合は、値trueをコンストラクターに渡す必要があります。

ReentrantLock lock = new ReentrantLock(true);

アオビン兄弟、フェアロックとアンフェアロックについて教えてください。
不公平について話した後、公正なプロセスについても話させてください。

行Aは、ロックを取得しようとしています。最初に状態を判断し、それも0であることがわかります。キューを確認した後、彼は実際には最初の状態であり、保持スレッドを自分自身として決定的に変更しました。

アオビン兄弟、フェアロックとアンフェアロックについて教えてください。
スレッドbは、状態を判断するためにここにありますね。実際にはstate = 1で、casが失敗したので、素直にキューに入れなければなりませんでした。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。
名前のないファイル(https://tva1.sinaimg.cn/large/00831rSTly1gcxaojuen2j30oa0jxgmh.jpg
無題のファイル(https://tva1.sinaimg.cn/large/00831rSTly1gcxaojuen2j30oa0jxgmh.jpg
スレッド暖かい男がここにいます。リリースしてすべての状態を変更し、スレッドBをウェイクアップするのにどのくらい時間がかかりますか。この時点でスレッドCが入っていますが、彼は最初に次の状態が0であると判断し、ショーがあると考えてから、キューを調べて、その前に誰かがいることを発見しました。 、新時代の良き市民として、断固として列を作った。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

スレッドBは、状態を判断するためにAの呼び出しを取得し、値が0であり、キューの最初でもあることを検出します。これは非常に香りがよく、取得できます。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

総括する:

要約すると、私は何も言いませんが、ロック判定のソースコード、矢印が指す位置を取得するために、それはすべて私によって合理的に説明されていますか?現在のスレッド、状態、0であるかどうか、現在のスレッドであるかどうかなど、すべてが考えます下。
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

幽霊は私が絵を描くためにどれだけしたか知っています、それを好きになるのは多すぎますか?
アオビン兄弟、フェアロックとアンフェアロックについて教えてください。

授業後の宿題

フェアロックは本当にフェアですか?では、どのレベルが絶対的に公平ではないのか、どのレベルが公平と見なすことができるのでしょうか。

私はインターネットで生き残ったツールマンのアオビンです。

最高の関係は相互の達成です。あなたの「3つの連続」はBingbingの作成の最大の動機です。次の号でお会いしましょう!

おすすめ

転載: blog.51cto.com/14689292/2545802