共有オブジェクトの「Java並行処理の戦闘」

序文

  ブログのこのシリーズは、これは主に以下の内容で、内容はより退屈になり、ここに要約「戦闘でのJava並行処理」少しです。あなたはハハ、特定の対象領域で使用される用語(用語)を説明するために、次は、私たちの国では、コンセプトのコレクションのタイトルを示しても、名詞または技術として知られている、それは専門用語ですが、最終的にはそれが何を意味するのか、タイトルの直感的な感覚を見ることができない場合があります名詞(名詞の文法とは異なります)。この用語は、音声またはテキストによる契約または科学的概念の限定された言語のシンボルを表現するために使用され、アイデアや知識ツールの交換です。私はこれらの条件の下で、あなたに説明するために、方言を使用しています。

スレッドセーフ

  スレッドセーフとは何ですか?これは共通の問題とみなされているスレッドの安全性の定義があいまいであるならば、私たちはインタビューの過程で直面していると信じて、スレッドセーフな定義では、コアコンセプトは、正確であるので、適切なの欠如があります明確に定義された自然。正確な意味、その動作仕様のクラスは、正確に、典型的には、オブジェクトの状態を制約するために十分に不変明細書の様々な条件を定義し、様々な定義実験条件の結果は、オブジェクトの動作を記載しました。それは、クラスまたはマルチスレッド環境のいずれかがシングルスレッド環境で正しく実行できることを意味し、このクラスはスレッドセーフです。別の実行スレッド中に原因が予測できない結果ならば、スレッドは安全ではありません。

可視

  変数が存在する場合、それは今読み書き動作され、視界は言う、現在のスレッドの変数の書き込み動作が他のスレッドに表示されている、他のスレッドは、この変数を変更したことを知ることができません。あなたが見え保証できない場合は、同期メカニズムを使用する必要があります。それ以外の場合、この変数を読み込むためのときに、他のスレッドは、値が失敗したことがあります。この値は、無効なデータと呼ばれています。
  JVMは、64ビットの読み出しまたは書き込み動作を2つの32ビット動作に、不揮発性長い可変型を読み取るとき、操作が読み取られた場合に書き込み可能長い二重変数の不揮発性タイプのため、ここで思い出さ別のスレッドで実行されたとき、それはない32の下位32高い値と別の値に読み取るので、マルチスレッド環境での共有変数と長い二重変数の他のタイプを使用することができます揮発性のキーワードはそれらを宣言していない限り、安全、またはロックによって保護されています。

  1. 今揮発紹介:Java言語は、他のスレッドに更新通知変数ことを確実にするために、弱い同期メカニズム、すなわち、揮発性タイプが用意されています。使用すると、揮発追加するには、変数の前にあります。JMMでは、共有メモリを使用して、スレッド間の通信を達成します。揮発性メモリの意味:
  • 揮発性変数を書き込む場合、JMMは直ちにメインメモリにフラッシュ、スレッドローカルメモリの共有変数値に対応します。
  • 揮発性の変数を読むとき、スレッドが無効になっているローカルメモリに対応するJMMなり、共有変数は、メインメモリから直接読み込まれます。
  1. 使用の揮発性の条件:
  • 変数への書き込みは、変数の現在の値に依存しない、またはあなただけの単一のスレッドが変数の値を更新することを確認することができます。
  • この変数は、他の状態変数と一緒に不変条件を含まれません。
  • 変数にアクセスするときにロックする必要はありません。

加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性,千万不要用它来确保原子性操作。

リリースと脱出

オブジェクトは、オブジェクトは、オブジェクトがアクセスまたは非プライベートのいずれかの方法で返すことができる他の参照コードに保存されている点に、例えば、現在のスコープ外のコード内で使用することができることを意味公開他のクラスの転写プロセスへの参照または参照。オブジェクト公開するべきではありませんがリリースされたとき、これはエスケープと呼ばれています。

スレッドが閉じ

変数データにアクセスする際の同期を使用することがしばしば必要と共有します。同期方法の使用を回避する1つの方法は、それは、スレッドの安全性の最も簡単な方法の実装である、唯一のシングルスレッドのデータアクセスで、同期が必要とされていない場合、この技術は、スレッドがクローズと呼ばれ、異なる共有データです。ここではいくつかのスレッドシーリング技術です。

  1. アドホックスレッドが閉じ

    アドホックスレッド閉鎖手段、負担する全責任を達成するためのプログラムの保守スレッド閉鎖。例えば、可視性改良剤またはローカル変数に、ターゲット・スレッドに閉塞可能なオブジェクト。実際には、スレッドのオブジェクトは、通常、共有変数に格納されている閉じました。アドホックスレッドの閉鎖は非常に壊れやすいので、プログラムは(、ThreadLocalのスタックを閉じて)あなたは、次の2つの手法を使用することができ、あまりそれを利用すること。

  2. 閉じたスタック

    また、内部のスレッドまたはスレッドローカルな使用として知られているスタックの閉鎖は、アドホック維持しやすく、そしてより堅牢よりも、ThredaLocalと混同しないでください。閉じたスタックでは、オブジェクトは、ローカル変数によってアクセスすることができます。

//伪代码
public void test(){
//定义一个变量
Set set ;
// 实例化一个TreeSet对象,并将该对象的一个引用保存到set中。
set = new TreeSet();
}
复制代码

そのようなTreeSetのオブジェクトはローカル変数で囲まれ、それはまた、スレッドスタックの実行に位置している実行スレッド、に近く、他のスレッドは、スタックにアクセスすることができません。

  1. ThreadLocalの

    閉じたスレッドを維持する方法がより標準化された使用のThreadLocalでのThreadLocalであることを、アクセスインタフェースまたはメソッドとして取得と設定提供するように、このクラスは、スレッドに格納された値と値を関連付けることができ変数のスレッドの各使用が別々のコピーが、そう常に現在のスレッドの実行セットで設定された最新の値を返します。ThreadLocalのは、一般的に画像を共有変数またはグローバル変数の単一のインスタンスを防止するために使用されます。

   //保存一个数据库连接对像
   public static ThreadLocal<Connection> connectionThreadLocal = 
   new ThreadLocal<Connection>(){
       @Override
       protected Connection initialValue() {
           return DriverManager.getConnection(DB_URl);
       }
   };
   //每个线程使用时直接get
   public static Connection getConnection(){
       return connectionThreadLocal.get();
   }
复制代码

不変性

それが作成された後、それを修正することができないような状態の1場合、オブジェクトは不変で、スレッドセーフセックスがオブジェクトを変更されていない固有の特性の一つです。条件については満足した場合、オブジェクトは不変です。

  • オブジェクトが作成された後、そのステータスを変更することはできません。
  • すべてのフィールドは、オブジェクトの最後のタイプです。
  • オブジェクトが正しく作成されます(オブジェクトの作成時に、このリファレンスは逃げ場はありません)

最終的なフィールド:不変オブジェクトのための構成。フィールドの最後のタイプは変更できません(ただし、最後のフィールドによって参照されるオブジェクトが可変である場合、これらの参照は、オブジェクトを変更することができます)。しかし、Javaのメモリモデルでは、最後のフィールドだけでなく、特別な意味論。最後のフィールドの安全性は、それによって無制限のアクセス不変オブジェクト、初期化プロセスを確保することができ、これらは共有オブジェクトを同期する必要はありません。

セキュリティリリース

  1. オブジェクトへのセキュリティオブジェクト参照を公開するには、オブジェクトの状態は、他のスレッドに表示されている必要があり、適切に構築されたオブジェクトは、次の方法で安全にリリースすることができます。
  • 静的初期化関数内のオブジェクト参照を初期化します。
  • 参照オブジェクトは、フィールドまたはAtomicreferanceオブジェクトの揮発性の種類に格納されています。
  • 適切に構築されたオブジェクトの最終タイプ・フィールドに保存されたオブジェクトへの参照。
  • オブジェクト参照がロックで保護されているドメインに保存されます。
  1. 並行プログラム内のオブジェクトを使用して共有すると、あなたはいくつかの実用的な戦略を使用することができます。
  • スレッドが閉じスレッドがオブジェクトにのみ、オブジェクトはこのスレッドで囲まれているスレッドが所有することができ閉じ、そして唯一このスレッドによって変更することができます。
  • 読み取り専用の共有:追加の同期せずに、共有オブジェクトは、複数のスレッドによってのみ同時アクセスを読み取ることができますが、任意のスレッドは、読み取り専用の共有オブジェクトは、オブジェクトと不変の事実不変オブジェクトが含まれ、それを変更することはできません。
  • 共有スレッドの安全性:その内部同期でのスレッドセーフなオブジェクトは、その複数のスレッドがさらに同期せずに、オブジェクトのパブリックインターフェイスを介してアクセスすることができます。
  • 保護の対象:保護されたオブジェクトは、パッケージングスレッドセーフなオブジェクト内のオブジェクト、およびオブジェクトを含む他のオブジェクトの保護が公開され、特定のロックによって保護され、特定の保持しているロックを介してアクセスすることができます。

ハードポイントの後には、ああ、フォーカスポイントのようにそれを見ることができます!プロフィールは、より多くのブログああがあります。間違っている場合は、私を修正してください。一緒にAC利息グループ。

おすすめ

転載: juejin.im/post/5d58d81551882521872b97e3