並行プログラミングの原則の芸術的-javaの2.java実現の基礎となる並行処理の仕組み

 

  Javaプログラミング・コードは、Javaバイトコード、内部JVMのバイトコード・クラス・ローダ、JVMバイトコードの実行をコンパイルされ、CPUの最終アセンブリ命令の実行に変換する必要があり、使用する同時実行のJavaに依存しますJVMの命令の実装とCPU。

2.1揮発性のアプリケーション

  マルチスレッドプログラミング同期と揮発性が重要な役割、揮発性軽量同期化を果たし、マルチプロセッサの開発における共有変数の「可視性」の彼を保証しました。視認性は、スレッドが共有変数を変更するとき、他のスレッドがこのスレッドの変更された値を読み取ることができることを意味します。適切に揮発性変数の修飾子を使用した場合、彼は以下の同期と実装コスト。彼はスレッドコンテキストの切り替えやスケジューリングは発生しませんので。

  2.1.1volatile定義の実装の原則

    揮発性のJava言語仕様バージョン3の定義は次のとおりです。Javaプログラミング言語では、スレッドが共有変数にアクセスすることを可能にする変数は、正確で一貫性のある最新情報を確実にするために共有することができ、ねじロック、彼はこの変数だけで行を介して取得することを確認する必要があります。

    Java言語は、揮発性の提供、およびフィールドがvolatileとして宣言されている場合、いくつかの例では、ロックよりも便利であるためには、Javaスレッドのメモリモデルは、すべてのスレッドがこの変数の値が同じであることを保証参照します。

    CPUの定義

    

    メモリの視認性を確保するためにどのように揮発性のでしょうか?

    インスタンス=新しいシングルトン(); //インスタンス変数と揮発性

    アセンブリ・コードに  

    ....

    そこ共有変数の書き込み動作、またはロックプレフィックス命令は、二つのことにつながるとき、揮発性の変数が変更されました

    1.現在のデータ・プロセッサ・キャッシュ・ラインがシステム・メモリに書き戻します

    2.ライトバックメモリ処理は、メモリアドレスのデータが有効でない他のCPUのキャッシュにつながることができます

     、処理速度を向上させるメモリ、およびプロセッサは、読み出し動作時に直接通信するが、今の内部キャッシュメモリシステムデータされていないが、操作が完了したときに知らないためにメモリに書き込まれます。あなたは、変数揮発書き込み操作を宣言した場合に実行され、JVMは、各プロセッサのキャッシュを確保するために、可変データキャッシュラインが複数のプロセッサの下で、システムメモリに書き戻され、プロセッサにロックプレフィックス命令を送信します同じで、キャッシュコヒーレンシプロトコルを達成する、各プロセッサは、自身のキャッシュ値をチェックし、プロセッサは、キャッシュラインがメモリアドレスに対応する自分自身を発見したとき、データバススニファの拡散に有効期限が切れていないが修正され、データの処理を変更するときに、プロセッサ・キャッシュ・ラインを無効状態に設定されている所有し、それはシステムメモリキャッシュ・プロセッサから読み出されたデータを再現します

    2の原則の揮発性の実現

      1.Lockプレフィックス命令は、(キャッシュロック)バックメモリへのプロセッサのキャッシュを引き起こします

      2.プロセッサのキャッシュメモリは、他のプロセッサのキャッシュが無効です原因に書き戻されます。

  2.1.2揮発性の使用の最適化

    彼はチームとチームを最適化する方法でvolatile変数、追加バイトを使用して、-TransferQueueリンクキューのセットの同時JDKの新しいクラスは、チームのパフォーマンスを示しています

2.2原則とアプリケーションの同期の実装

   例外がスローされたときにロックが解除されるまで、スレッドへのアクセスは、我々は最初のロックオブジェクトコードブロックまたは終了を取得しなければならないときに、Javaのすべてのオブジェクトは、ロックとして使用することができます。

   3つの一般的な使用法:  

     通常の方法、

     staticメソッド

       シンクブロック

  静的メソッドと従来の方法はACC_SYNCHRONIZEDロックフラグ、ブロック同期コード及び命令処理にMonitorEnter命令によって達成MoniterExitことによって達成されるコンパイルMonitorEnterれるコードは、開始位置に挿入されています。MoniterExit命令コードと端が送出位置に挿入されています 

  2.2.1 Javaオブジェクトヘッダ

  比較2.2.2アップグレードおよびロック

    Javaのse1.6取得し、ロックがパフォーマンスもたらした消費量を減らす解放するためには、「偏ったロック」と「軽量ロック」の導入がローからハイへの4つの状態の合計をロックは、次のとおりです。ロックフリー状態、偏ったロックステータス、軽量かつヘビー級ロックロック状態では、これらの状態はエスカレート状況と競合します。ロックはアップグレードできますが、ダウングレードすることはできません。ロック・エスカレーションは、戦略は、効率を改善し、ロックを解除するためにロックを取得するように設計されてダウングレードすることはできません。

    図1に示すように、バイアスされたロック

      ほとんどの場合、マルチスレッドロックだけでなく、競争力はありませんが、常に同じスレッドで何度も取得し、低コストとバイアスロックの導入を可能にするためにロックを取得するためのスレッド。ときに1つの同期コードブロックにアクセスして、ロックを取得するスレッドは、記録ヘッドにロックされ、オブジェクトスタックフレームストアはバイアススレッドIDをロックで、CAS動作はスレッドの入口と出口ロック同期コードブロックの後に必要とされませんまたはロック解除、マーク単語は、単に、オブジェクトが現在のスレッドにバイアスされたロックを指しヘッドに記憶されているかどうかをテストします。テストが成功した場合、それは、スレッドがロックを獲得したことを示しています。テストが失敗した場合は、(電流を示すことは偏ったロックである)1に設定されてバイアスされ、ロックのアイデンティティにマーク・ワードをテストする必要があります。設定されていない場合は、CASはロックを競う;設定した場合、CASオブジェクトヘッドを使用してみてください現在のスレッドにバイアスロックポイント。

    (1)バイアスロック失効

      ロック機構を解放する競争力のある外観を使用してロックが、現在のすべてのスレッドがロックがロックする傾向にあるスレッドリリースを、バイアスされたロックを競う保持しようとするまで待つ傾向にあります。バイアスされたロックの取り消しは(いない、このバイトコードの実行時間に)グローバルセキュリティドットを待っている必要があり。彼は最初にバイアスロックしているスレッドを中断する必要があり、その後、スレッドは、スレッドがアクティブでない場合、スレッドがまだ生きている場合は、スタックの偏ったロックがされると、オブジェクトヘッドロック状態は、Noneに設定されている、生きているロックバイアス保持しているかどうかをチェックします実行、トラバースロックオブジェクトレコードをロックバイアスされ、マークWordのレコードのスタックとオブジェクトヘッドをロックのいずれかの他のスレッドに有利になるように偏った、またはロックフリー状態に戻すか、最後のウェイクアップスレッドをロックバイアスとしてタグ付けされたオブジェクトが適切でない再。

 

  (2)閉じたバイアスロック

      偏向锁1.6和1.7默认是开启的,在程序启动几秒后才激活,有必要可以使用jvm参数来关闭延迟 -XX:BiasedLockingStartupDelay=0。如果你确定应用程序里所有的锁通常情况下处于竞争状态,可以通过jvm参数来关闭偏向锁 -XX:-UswBiaseLocking=false,那么程序默认进入轻量级锁的状态。

  2.轻量级锁

   (1)轻量级锁加锁

      线程在执行同步代码块之前,jvm会先当前线程的栈帧中穿建用于存储锁记录的空间,并将对象头中的Mard Word复制到锁记录中,官方称为Displaced Mark Word。然后线程尝试使用CAS将对象头中的Mard Word替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。

   (2)轻量级解锁

      轻量级锁解锁时,会使用原子的CAS操作将Displaced Mark Word替换回到对象头,如果成功,则表示没有竞争发生,如果失败,表示当前锁存在竞争锁就会膨胀成重量级锁

 

    因为自旋会消耗CPU,为了避免无用的自旋(比如获得锁的线程被阻塞住了),一旦锁升级成重量级锁,就不会在恢复到轻量级锁状态。当所处于这个状态下,其他线程试图获取锁时,都会被阻塞住,当持有所得线程释放锁之后唤醒这些线程,被唤醒的线程就会进行新一轮的夺锁之争。

  3.锁的优缺点对比

  

2.2.3 原子操作的实现原理

   原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)本意为“不可被中断的一个或一系列操作”。再多处理器上实现原子操作就变得有点复杂

  1.术语定义

 

 

  2.处理器如何实现原子操作

    1.使用总线锁保证原子性

    2.使用缓存锁保证原子性

    有两个操作不会使用缓存锁

      当操作数据不能被缓存的处理器内部,或操作的数据跨多个缓存行时 处理器会调用总线锁

      有些处理器不支持缓存锁

   

 

おすすめ

転載: www.cnblogs.com/panda777/p/11298333.html