上の記事秩序の視認性が、事前発生を取得するために、2つの同時3で問題を解決するために、今日はアトミック性の問題を解決する方法について話します
問題の原因は原子であるスレッドの切り替えが、マルチコアCPUのコンテキストで、スレッドの切り替えができないことはできません、いわゆる「魔法が行く、道の尾根」、新しいルールがあります:
相互に排他的:その実行の唯一のスレッド
実際には、上記の文章の意味:共有変数の変更は、相互に排他的である、それは、スレッドが共有変数の変更は、他のスレッドによって変更することができないとき、この問題は達成するためにどのようにして、操作が中断された存在しないと言うことですそれをミューテックス?
ロック
同時理解パートナーがすぐに小さな考えることができますロックこの概念を、そしてあなたの最初の反応は、同期を使用することはおそらくあり、ここであなたは、3つの一般的な同期の使用を記載されています:
public class ThreeSync {
private static final Object object = new Object();
public synchronized void normalSyncMethod(){
//临界区
}
public static synchronized void staticSyncMethod(){
//临界区
}
public void syncBlockMethod(){
synchronized (object){
//临界区
}
}
}
3種類の同期ロックの内容は、いくつかの違いがあります。
- 通常の同期方法のために、ロックオブジェクトの現在のインスタンスであり、これは通常のことをいいます
- 静的同期方法のために、現在のクラスのロックは、ThreeSync.classとして、クラスオブジェクトであります
- ブロックを同期化する方法は、オブジェクトのロックを括弧内に同期されます
私は意図的に言葉のコメント「重要な領域」内の3つの同期コード、それは重要な地域である何を追加しましたか?
クリティカルエリア:私たちが見てクリティカルセクションの相互に排他的で実行する必要があるコード
ここでは、すべての文字列での認知や知識の面は、クリティカルセクションのロックを保護するための鍵どのように効果的であるあなたは、同時書き込みは、この章を知るでしょう場合、直接バグに関連した後は、あなたがどんなにいることがわかります暗黙のロック/内蔵のロック(同期)または表示ロック(ロック)この関係を使用するために探している、関係、右上のすべて、私を見てみましょう
上記3つの方法は、図をロックするために使用することができる発現。
スレッドが重要なゾーンに入る、(ロックをロックしようとする前に)(共有変数を変更するため)、ロックが成功すると、クリティカルセクション、スレッドあなたは、コードのクリティカルセクションを実行した後、ロックを保持し、実行ロック解除()、ロックを解除します。このモデルのために、私たちはしばしばトイレピットをつかむために位置を記述するために使用します。
早期学習と私はロックを覚えているが、コードの実装は、我々は簡単に二つのことを無視することができる方法を理解する上でのJava:
- 我々はそれを何をロックしていますか?
- 私たちの保護とは何ですか?
2つの単語を使用すると、リソースの重要な領域のロックを保護する役割を果たすことができるということですか?だから我々は、さらに上位モデルを改良したいです
実際には、我々は何かをロックするための独自のロックを保護するために彼らの必要性を認識しているこの文は、あなたが明確に持っている知っているあなたの行動の言語に翻訳した後、:
- あなたのロックは何ですか
- あなたが保護されたリソース
CPUは、私たちが保護したいとてもスマートです、我々はロックがあり、私たちは、リソースを保護したいのか、それがロックリソース(共有変数)によって保護されるかを明確に述べることを持っている私たちの脳のようではありません
フィギュア、我々は資源を保護したいリソースR(共有変数)を取るので、私たちは資源RのRは、気配りの友人がマップいくつかの質問に見つけることができ保護するためのロック・リソースを作成する必要があります。
点RとLRの間に明確な関係があり
、我々はプログラムを書く際に、多くの場合、モデルの心の中で誰かの家保護のロックとリソースRを(保護する役割を果たすことができない彼らのロックにつながる、右であるが、この時点の関係を無視するには、ロック何かの誰かの家で自分の家庭や自分の家を守るために何か)、そして最終的に並行処理のバグにつながる、あなたは明確な関係を見出すために、スケッチしています
LRは左非共有変数を指している行を点在
LRリソースを保護するとRは、非共有変数を保護する必要はないと、直接寄せ集め、資源の不確実性を保護することである、行うのは簡単で書かれた手順と保護あなたは害が完了理解するために、2つの例を引用します
- シリアルプログラムを書くとき、試してお勧めしません...プロセス全体をキャッチするので、見つけることは難しいがあるかどうか尋ねる、同じ理由から、我々は十分な経営資源を保護するためにロックし、正確なロックを使用し、他ませんリソースがロックされていないという意味
- 物事を保護するために、より多くのロック、実際には、他のスレッドが長い時間を待っていることができますので、同時効率が低下している大きなクリティカルセクション、長い時間の重要なゾーンに出すために重要なエリアから糸、この問題は、ロックの大きさに関係している、また、フォローアップの手順を行います
より実用的な心を説明するプログラムAPEまたは単にコードを取る、私は見てみましょう:
public class ValidLock {
private static final Object object = new Object();
private int count;
public synchronized void badSync(){
//其他与共享变量count无关的业务逻辑
count++;
}
public void goodSync(){
//其他与共享变量count无关的业务逻辑
synchronized (object){
count++;
}
}
}
これは、同期方式に言っているのではないだけで、適切なロックの粒度をあなたに思い出させるために、良いではない、より効率的になります
プログラムカウンタの例では、私たちはしばしば書きます:
public class SafeCounter {
private int count;
public synchronized void counter(){
count++;
}
public synchronized int getCount(){
return count;
}
}
図は、モデルの上にあるプログラムを示しています。
ここでは、ロックthis.countを保護するために、これです。あなたはsynchronizedキーワードを追加しない場合でも、一部の学生は、同様にgetCountメソッドにそれが読み取り操作であるため、synchronizedキーワードを追加する必要を考えていない、共有変数への変更をすることはありません、それは記事の監視に反していることは起こる-前に、我々は上のルールロックのルール:
ロック解除のためのロックが起こり、前にロックのその後のロック
読みカウントに書かれて表示されていないカウントする可能性があり、それはダーティリードにつながります
私たちは、このロックは、複数のリソースを保護することができ、さまざまなロックの数とそのリソースの保護はそれことができます参照してください上記の?プログラムを見てください:
public class UnsafeCounter {
private static int count;
public synchronized void counter(){
count++;
}
public static synchronized int calc(){
return count++;
}
}
慎重に目を大きく開いを見て、ロックがこれは、ロックがUnsafeCounter.classがあり、彼らは共有変数countを保護したい、あなたは思いますか?次の図は、線路モデルは、プログラムの面である示しています。
保護するために、二つの異なるロックと2つの重要な部分は、それが数を保護することはできません、ノークリティカルセクション相互に排他的な関係があるので、このロックは無意味です
概要
- 原子は、問題を解決することは中間状態を外部表示されないことを保証することである、相互に排他的です
- ロック(図を矢印)保護されたリソースを保護することができ、あなたのロックを知るために、より重要なのは、保護されるべきものを資源、私達はロックが正確に何を知っている、原子課題を解決するための鍵であります
- 実効クリティカル領域は、リソースを保護するために、入口と出口、より重要なエリア、ミューテックス保護を果たしていなかった複数の入口と出口複数の並列があるある資源、である、重要な領域は名前に存在するのみ
- 全体の地区のロック場合、領域全体をロックする必要はありません、自分のリソースを保護するために、ドアをロックし、真剣に他の所有者の活動に影響を与えている(ロックの粒度の問題)
本稿では、同期ロックは主に、人々は、アトミックな問題を解決するために使用するマクロ概念を、構築を支援するために、アトミックの問題を解決する方法を説明するために、そのように関係なく、あなたが、心として、このセクションで説明したモデルを思い出す限り、あなたが見たもの、その後のロックすべては、学習曲線が非常に緩和され、新しい名前を見つけます。
ここでは、マクロという概念を持っているように、3つの同時秩序の問題、可視性、アトミックは、距離によって複雑になるソリューションを、持っている。しかし、インタビューや戦闘のストレスは詳細です、我々は作ら遠くと近く、徐々によくある質問詳細同時ちなみにインタビュアーを参照してください
ソウルの質問
- 複数のロックリソースは問題があるでしょうか?
- 必要なセルをロックするときは、ドアをロックすることはできませんか?
- 銀行振込、システムの変換と他の二人は、自分自身をオンにし、適切なロックの粒度のどのような?
生産性ツールを改善
推奨読書
- 世界への同時実行は、お見逃しなく
- 並行プログラミングを学び、これらの3つのコアの十分な理解が鍵となります
- 3のソースによって複雑バグ、それらを見るためにあなたの目を開いた保ちます
- 可視性の秩序は、事前発生を取得します
- インタビューに基づいて、インタビュアーは常に、なぜ文字列をお願いしたいですか?
継続的な社会的関心番号へようこそ:「アーチ日の兵士」
- ドライ最先端のJavaテクノロジーの共有
- 生産性ツールの概要|返信「ツール」
- 面接の質問と回答の分析
- テクニカルデータ収集|返信する「情報」
複雑な問題、問題プログレッシブ技術的な問題の原則の具体的な抽象的でグラフィカルな分解の簡素化に合わせて、楽しい学習のJavaテクノロジー・スタック関連の知識を考え探偵小説を読みやすい、技術を更新し続け、ご期待ください......