Javaコンテンツの復習-スレッド同期

5053 ワード

Usafeは反射に似ています. しかし、Unisafe速度は反射が速いので、Unisafeを通じて、あるメンバー変数のクラスに対するオフセット量を取得してから、オフセット量によってあるオブジェクトのこのメンバー変数の値を取得することができます. .多くのロックの同期の下の階はユニセーフで作られています.UnsafeのCASのようです
http://frankfan915.iteye.com/admin/blogs/1153726
 
        Reentrant Lock
Reentrant Lockの特徴は
1.ロックを取得したスレッドは繰り返しロックを獲得し、ロックの回数が増える.リリースする時も該当回数を解放して、現在のロックを完全に解除する必要がある.
2. ロックとロックは同じコードブロックになくてもいいです.unlockは一般的にfinalブロックにあります.
3. RentrantrantLockはCAS機構で同期を保証します.スピードはSycronizedより速いです.
 
4. RentrantrantLockは公平ロックと非公平ロックに分けられています.公平ロックは先にロックを申請し、先にロックを獲得します.
5. RentrantrantLockはacquire Interruptibly方法を呼び出してロックを取得できます.スレッドが中断された時に異常を投げます.デッドロックを防ぐことができます.
6. RentrantLockは複数のconditionをサポートしており、putとgetの多条件待ちの問題をうまく解決できます.
          http://frankfan915.iteye.com/admin/blogs/1182026
          http://frankfan915.iteye.com/admin/blogs/2099821
 
         
        synchronizedの底辺実現は、主にLock-Freeのキューに依存しており、基本的な考え方はスピン後のブロッキングであり、競争切り替え後も競合ロックを継続し、やや公平性を犠牲にしたが、高スループットを獲得した.
          http://blog.csdn.net/chen77716/article/details/6618779
 
        Volatile 
         Volatileの長所は
         1.コードは比較的簡単で、変数の前にVolatileを追加すればいいです.
         2.拡張性が良い
         3.性能がいいので、コードブロックをロックする必要はありません.
         4.Volatileは変数の視認性を保証していますが、変数の原子性は保証できません.
         
         短所:
         間違えやすいので、デザインが難しいです.
         
         Volatileを加えた変数の更新は、主メモリに直接更新されるのが原理です.複数のスレッドは1つのメインメモリを共有していますが、スレッドごとに作業スレッドがあります.Volatileがない変数については、スレッドはメインスレッドを作業メモリにコピーして操作します.修正された値は作業メモリに一時保存され、主メモリに更新できない場合があります.Volatileは一般的にCASと一緒に使用して、データ操作の原子性を保証します.詳しくはRentrant Lockを参照してください
          http://frankfan915.iteye.com/admin/blogs/1222627
         
          Interruptとstopの違い:
このスレッドが中断可能な状態にあると、(X.waitを呼び出した)、またはSelector.select()、Thread.sleep()など特定のブロックが発生します. アプリ)は、スレッドがすぐに呼び覚まされ、同時にInterruptedExceptioを受けます.また、ioに閉じ込めると、対応するリソースがシャットダウンされます.もしこの線が 次に、「Thread.interrupted()方法(interruptではない)を実行しないと、スレッドが任意のioリソースを処理すると、これらのリソースがクローズされます.interruptはスレッドが直接終了するか、それともrun関数が継続されますか?
Stopはスレッドを直接終了させます.
 
          スレッドが閉じられているということは、変数が一つのスレッドだけで使用されてスレッドが安全になるということです.3つの場合:1.各オブジェクトが一つのスレッドだけで使用されている場合はConfinementです. 2.メソッド内のメンバー変数 3.ThreadLocalで得られた変数
http://frankfan915.iteye.com/admin/blogs/1223081
 
           Sleepとwaitの違い: sleepから thread類、wait由来 object類 
sleepはロックを解除しないで、スレッドの制御権がまだあります.waitはロックを釈放して、スレッドの制御権を差し出して、notifyを必要とします. 
sleepは異常を捉えなければなりません.waitは必要ありません. 
 
 
           Thread ジョインメソッドは、スレッドオブジェクトのロックを先に取得し、waitメソッドを呼び出します.
http://frankfan915.iteye.com/admin/blogs/1222319
 
         ロックとconditionの使用
http://frankfan915.iteye.com/admin/blogs/2099821
 
         Linked Blocking Que
http://frankfan915.iteye.com/admin/blogs/2099831
 
         コンカレントリンク
http://frankfan915.iteye.com/admin/blogs/2099850
 
     ConcerenthashMapは複数のSegmentを使ってデータを記憶しています.各Segmentは一つのhashTableに相当しています.異なるSegment間の読み書き操作は関係がありません.同じSegmentの書き込みと削除はロックが必要です.読むにはロックが必要です.増加したロックは列の頭に置いています.削除は、削除されるノードの前のすべてのノードをコピーして実現します.
http://www.iteye.com/topic/344876
 
CountDown Latch そのSync関数はReentrant Loc kと異なり、state値が0の場合、1に戻り、現在のスレッドが再スケジュールされていることを示しています.他の関数は、tryRelease Shardを呼び出して、state==0の場合、unparkが待つスレッドを下げます.
 private static final class Sync extends AbstractQueuedSynchronizer {
        private static final long serialVersionUID = 4982264981922014374L;
        protected int tryAcquireShared(int acquires) {
            return (getState() == 0) ? 1 : -1;
        }

        protected boolean tryReleaseShared(int releases) {
            // Decrement count; signal when transition to zero
            for (;;) {
                int c = getState();
                if (c == 0)
                    return false;
                int nextc = c-1;
                if (compareAndSetState(c, nextc))
                    return nextc == 0;
            }
        }
    }