再ロックが可能であることを知っておく必要があります


リエントロック可能
再ロック可能とは、スレッドがリソースにロックをかけた後、ロックを解除せずにリソースをロックし続けることです.
では、鍵を再ロックできるメリットは何ですか?
  • 再ロックは、プログラミングの複雑さを低減する
  • デッドロックの発生を減らす
  • 栗を挙げます.
    public class MyReentrant {
    	public static void main(String[] args) {
    		new Thread(new Runnable() {
    			@Override
    			public void run() {
    				synchronized (this) {
    					System.out.println(" 1    ,    :" + this);
    					int index = 1;
    					while (true) {
    						synchronized (this) {
    							System.out.println(" " + (++index) + "    ,    :" + this);
    						}
    						if (index == 10) {
    							break;
    						}
    					}
    				}
    			}
    		}).start();
    	}
    }
    
    

    再ロック可能な2つの実装
    再ロックはsynchronizedとReentrantLockの2つの実装があり、両者の特徴を簡単に紹介します.
  • synchronizedの特徴:ロックをかけて、ロックを解放して自動的に行って、操作しやすくて、しかし重い
  • ReentrantLock ReentrantLockは手動でロックとロックを解除する必要があり、ロックとロックの解除回数が一致し(一致しないとデッドロックになる)、柔軟性が良い
  • .
    両者の違い:synchronizedはみんなの古い友达で、ReenTransLockはsynchronizedに比べて公平なロックを実現することができて、応答の中断などの操作
    フラットロック
    フェアロックはよく理解され、非フェアロックとは異なり、非フェアロック、すなわち、すべての待機スレッドが不公平なcpuタイムスライス競争を行い、cpuタイムスライスがどのスレッドを実行するかは固定的で不確定である.フェアロックはスレッドの待ち時間を考慮し、cpuは待ち時間が最も長いスレッドを優先的に実行します.
    ReentrantLockは,公平ロックがスレッドに対するcpuの実行順序を順次制御できることを実現した.
    レスポンスわりこみ
    応答割り込みはスレッドがロックを取得できず、ずっと待たないことであり、ReentrantLockは割り込み応答を与える.以下のデッドロックは、ReentrantLockによってスレッドを中断してデッドロックを解除することができます.
    public class Test2 {
        static Lock lock1=new ReentrantLock();
        static Lock lock2=new ReentrantLock();
        public static void main(String[] args) {
            Thread thread=new Thread(new ThreadDemo(lock1,lock2));
            Thread thread1=new Thread(new ThreadDemo(lock2,lock1));
            thread.start();
            thread1.start();
            thread.interrupt();
        }
    }
    

    ここでは2つのロックlock 1とlock 2を定義した.次に、2つのスレッドthreadとthread 1を使用してデッドロックシーンを構築します.通常、この2つのスレッドは互いにリソースの取得を待機し、デッドサイクル状態にある.しかし、threadが中断すると、別のスレッドがリソースを取得し、正常に実行できます.
    再入ロックの実現原理
    各ロックには、リクエストカウンタが関連付けられ、ロックを取得するスレッドがマークされます.
  • カウンタが0であることは、ロック未占有
  • を示す.
  • スレッドがロックを要求すると、JVMはスレッドをマークし、カウンタ+1
  • 再入時、カウンタは
  • 増加する.
  • スレッドが同期方法または同期コードブロックを終了すると、カウンタは
  • 減少する.
  • カウンタが0の場合、JVMはスレッドがリソースに対してロックを解除したと判断し、他のスレッドはこのロック
  • を取得することができる.
    注意:カウンタの設定自体に欠陥があります.