ロック|00 Javaでのロック分類

3729 ワード

転載記事:
https://www.cnblogs.com/qifengshi/p/6831055.html
種類ロックの分類:
  • フェアロック/非フェアロック
  • 再入ロック
  • プライベートロック/共有ロック
  • 反発ロック/読み書きロック
  • 楽観ロック/悲観ロック
  • セグメントロック
  • 偏向錠/軽量級錠/重量級錠
  • スピンロック
  • フェアロック/非フェアロック
    フェアロックとは、複数のスレッドがロックを申請する順序でロックを取得することを意味する.非公平ロックとは、複数のスレッドがロックを取得する順序が申請ロックの順序ではなく、後の申請のスレッドが先の申請のスレッドよりも優先的にロックを取得する可能性があることを意味する.優先順位が逆転したり、飢餓が発生する可能性があります.Java ReentrantLockでは、コンストラクション関数によってロックがフェアロックであるかどうかを指定し、デフォルトは非フェアロックです.非公平ロックの利点は、スループットが公平ロックよりも大きいことである.Synchronizedにとって、非公平ロックでもある.ReentrantLockがAQSによってスレッドスケジューリングを実現しているわけではないので、フェアロックにする方法はありません.
    リエントロック可能
    再入可能ロックは再帰ロックとも呼ばれ、同じスレッドが外層メソッドでロックを取得すると、内層メソッドに入ると自動的にロックが取得されます.
    抽象的な話ですが、次のコードの例があります.Java ReentrantLockにとって、彼の名前は再ロック可能であり、その名前はRe entrant Lock再ロックであることがわかります.Synchronizedについても、再入可能なロックである.再ロック可能な利点の1つは、デッドロックをある程度回避できることです.
    synchronized void setA() throws Exception{
        Thread.sleep(1000);
        setB();
    }
    
    synchronized void setB() throws Exception{
        Thread.sleep(1000);
    }

    上のコードは再ロック可能な特徴であり、再ロック可能でなければsetBは現在のスレッドで実行されず、デッドロックを引き起こす可能性があります.
    プライベートロック/共有ロック
    ワンウェイロックとは、ロックが一度に1つのスレッドにしか持たれないことを意味します.共有ロックとは、複数のスレッドによって保持され得るロックを指す.
    Java ReentrantLockにとって、それは独楽ロックである.しかし、ロックの別の実装クラスReadWriteLockについては、そのリードロックは共有ロックであり、そのライトロックはユニークロックである.読み取りロックの共有ロックは、同時読み取りが非常に効率的であることを保証し、読み取り、書き込み、書き込みの過程は反発します.ワンウェイロックと共有ロックもAQSによって実現され、異なる方法を実現することによって、ワンウェイまたは共有が実現される.Synchronizedにとって、もちろん独楽ロックです.
    反発ロック/読み書きロック
    上記のユニークロック/共有ロックは広義の言い方であり、反発ロック/読み書きロックが具体的な実現である.反発ロックJavaでの具体的な実装はReentrantLock Javaでの読み書きロックの具体的な実装はReadWriteLockである
    楽観ロック/悲観ロック
    楽観的ロックと悲観的ロックは、具体的などのタイプのロックではなく、同時同期を見る角度を指します.悲観的なロックは,同じデータの同時操作に対して,必ず修正が発生し,修正がなくても修正が発生すると考えられる.従って、同じデータの同時操作に対して、悲観的なロックはロックされた形式をとる.悲観的には,ロックをかけない同時操作には必ず問題が発生すると考えられる.楽観的ロックは,同じデータの同時操作に対しては修正は起こらないと考えられる.データを更新するときは、更新を試み、絶えず再更新する方法でデータを更新します.楽観的には、ロックをかけない同時操作は大丈夫だと考えています.
    上記の説明から、悲観的なロックは書き込み操作が非常に多いシーンに適しており、楽観的なロックは読み取り操作が非常に多いシーンに適しており、ロックをかけないとパフォーマンスが大幅に向上することがわかります.悲観ロックJavaでの使用は,様々なロックを利用することである.Javaでの楽観的なロックの使用は、ロックなしプログラミングであり、CASアルゴリズムがよく採用されており、典型的な例は原子類であり、CASスピンによって原子操作の更新を実現している.
    セグメントロック
    セグメントロックは、実際にはロックの設計であり、具体的なロックではなく、ConcurrentHashMapにとって、その同時実装は、セグメントロックの形式によって効率的な同時動作を実現することである.ConcurrentHashMapでセグメントロックの意味と設計思想を説明すると、ConcurrentHashMapのセグメントロックはSegmentと呼ばれ、HashMap(JDK 7とJDK 8のHashMapの実現)に似た構造であり、内部にはEntry配列があり、配列の各要素はチェーンテーブルであり、同時にReentrantLock(SegmentはReentrantLockを継承している)である.put要素が必要な場合、hashmap全体をロックするのではなく、hashcodeによってそのセグメントに置くことを知ってから、このセグメントをロックするので、マルチスレッドputの場合、1つのセグメントに置かない限り、真の並列挿入が実現されます.ただし、sizeを統計する場合、hashmapグローバル情報を取得する場合、統計するにはすべてのセグメントロックを取得する必要があります.セグメントロックの設計目的は、ロックの粒度を細かくすることであり、操作が配列全体を更新する必要がない場合、配列の1つだけに対してロック操作を行う.
    偏向ロック/軽量ロック/ヘビー級ロック
    この3つのロックは、ロックの状態を指し、Synchronizedに対してである.Java 5では、ロックアップグレードのメカニズムを導入することによって、効率的なSynchronizedを実現する.この3つのロックの状態は、オブジェクトモニタのオブジェクトヘッダ内のフィールドによって示されます.バイアスロックとは、同期コードが常に1つのスレッドにアクセスされている場合、スレッドが自動的にロックを取得することを意味します.ロックを取得するコストを削減します.軽量ロックとは、ロックがバイアスロックである場合、別のスレッドにアクセスされると、バイアスロックが軽量ロックにアップグレードされ、他のスレッドがスピンの形でロックを取得しようとし、ブロックされず、性能が向上することを意味します.ヘビー級ロックとは、ロックが軽量級ロックである場合、もう一つのスレッドがスピンであるが、スピンがずっと続くことはなく、スピンが一定回数ある場合、まだロックが取得されていない場合、ブロックに入り、このロックがヘビー級ロックに膨張することを意味する.ヘビー級ロックは、他の申請のスレッドをブロックし、パフォーマンスを低下させます.
    スピンロック
    Javaでは、スピンロックとは、ロックを取得しようとするスレッドがすぐにブロックされるのではなく、ループ方式でロックを取得しようとする利点であり、スレッドコンテキストの切り替えの消費を減らすことであり、欠点はループがCPUを消費することである.典型的なスピンロック実装の例は、スピンロックの実装を参照することができる.
    転載記事:
    https://www.cnblogs.com/qifengshi/p/6831055.html