次のように、この記事のreadwritelockの特徴に関する主な研究。
ReadLockとReadLockは相互に排他的ではありません
ReadLockとWritelockは相互に排他的です
WriteLockとReadLockは相互に排他的です
WriteLockとWritelockは相互に排他的です
スレッド1、最初にリードロックを取得し、スレッド2がリードロックを取得しようとします。スレッド1を取得し、最初に読み取りロックを取得し、スレッド2がライターロックを取得しようと試み、ブロッキングと待機をします。スレッド1がロックをリリースするまでスレッド1を取得できます。
パッケージcom.alio.lock; import java.text.simpledateformat; import java.util.date; import java.util.util.concurrent.locks.lock; import java.util.concurrent.locks.readwriteLock; Import java.util.current.locks.reentrantredreadwreock; readwriteLockdemo {static simpledateformat sdf = new simpledateformat( "yyyy-mm-dd hh:mm:ss.sss"); public static void main(string [] args){data data = new data(); worker t1 = new Worker(data、false); true); // read t1.start(); t2.start(); t3.start();} static class workers extends thread {data data; boolean read; public Worker(boolean read){this.data = data; this.read = read;} public void run(){if(read)data.read(); else data.write();}} static class data {readwritelock lock = new reintrantreadwritelock(); lock read = lock.readlock(); lock write = lock.writelock(); public void write(){try {thread.sleep(2000); //} catch(Exception e)(Exception e) {} write.lock(); system.out.println(thread.currentthread() + "write:begin" + sdf.format(new date())); try {thread.sleep(5000); //} catch(exceance e){} fullly {system.out.out.out.println(swreet.currentthread()write:end " + date()) "read:end" + sdf.format(new date())); read.unlock();} return 1;}}}}}}}スレッド[スレッド2,5、メイン]読み取り:2018-01-22 13:54:16.794を開始
スレッド[スレッド1,5、メイン]読み取り:2018-01-22 13:54:16.794を開始します
スレッド[スレッド2,5、メイン]リード:終了2018-01-22 13:54:21.795
スレッド[スレッド1,5、メイン]リード:終了2018-01-22 13:54:21.795
スレッド[スレッド-0,5、メイン]書き込み:2018-01-22 13:54:21.795を開始します
スレッド[スレッド-0,5、メイン]書き込み:終了2018-01-22 13:54:26.795
3つのスレッドが同時に開始され、その中にスレッド1スレッドThread[Thread-0,5,main],あり、書き込みを実行するときに2秒間眠ります。次に、スレッドNo. 2、スレッド番号3 Thread[Thread-1,5,main],Thread[Thread-2,5,main]コードの実行を優先します
read.lock();
read.lock();相互に排他的ではありません(リエントラントになる可能性があります)、彼らは同時にロックを取得しました、それはログを通して見ることができます
スレッド[スレッド2,5、メイン]読み取り:2018-01-22 13:54:16.794Thread [Thread-1,5、Main]読み取り:2018-01-22 13:54:16.794を開始します
また、オーバーヘッドの実行時間は同じです(テストコードは5秒間眠っています)ため、実行も同時に終了します。
スレッド[スレッド2,5、メイン]読み取り:2018-01-22 13:54:21.795THREAD [Thread-1,5、Main] Read:End 2018-01-22 13:54:21.795
すべてのReadLockがリリースされた場合にのみ、WriteLockがロックを取得できます。この時点で、スレッド[スレッド1,5、メイン]およびスレッド[スレッド2,5、メイン]の実行後、ロックはリリースされます。
したがって、 Thread[Thread-0,5,main] Writelockを取得し、現時点で独自のビジネスコードを実行しました
スレッド[スレッド-0,5、メイン]書き込み:2018-01-22 13:54:21.795Thread [スレッド-0,5、メイン]書き込み:End 2018-01-22 13:54:26.795
上記はすべて、Java Language ReadWritElock機能の例のテストに関するものです。誰にとっても役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!