Java言語ReadWriteLockプロパティインスタンステスト

4316 ワード

本研究は主にReadWriteLock特性であり,具体的には以下の通りである.

ReadWriteLockのいくつかの特性


readLockとreadLockは互いに反発しないreadLockとwriteLockは互いに反発するwriteLockとreadLockは互いに反発するwriteLockとwriteLockは互いに反発する

例として、


スレッド1、先にreadLockを手に入れて、スレッド2はreadLockを手に入れて、スレッド1を手に入れて、先にreadLockを手に入れて、スレッド2はwriteLockを手に入れて、ブロックして待って、スレッド1がロックを解放してからスレッド1を手に入れることができて、先にwriteLockを手に入れて、スレッド2はreadLockを手に入れて、ブロックして待って、スレッド1がロックを解放してからスレッド1を手に入れることができて、先にwriteLockを手に入れて、スレッド2はwriteLockスレッド1がロックを解除するまで

テストコード


package com.alioo.lock;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
/**
 *
 */
public class 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);
		// 
		Worker t2 = new Worker(data, true);
		// 
		Worker t3 = new Worker(data, true);
		// 
		t1.start();
		t2.start();
		t3.start();
	}
	static class Worker extends Thread {
		Data data;
		Boolean read;
		public Worker(Data data, Boolean read) {
			this.data = data;
			this.read = read;
		}
		public void run() {
			if (read)
			    data.read(); else
			    data.write();
		}
	}
	static class Data {
		ReadWriteLock lock = new ReentrantReadWriteLock();
		Lock read = lock.readLock();
		Lock write = lock.writeLock();
		public void write() {
			try {
				Thread.sleep(2000);
				//
			}
			catch (Exception e) {
			}
			write.lock();
			System.out.println(Thread.currentThread() + " write:begin "
			     + sdf.format(new Date()));
			try {
				Thread.sleep(5000);
				//
			}
			catch (Exception e) {
			}
			finally {
				System.out.println(Thread.currentThread() + " write:end "
				      + sdf.format(new Date()));
				write.unlock();
			}
		}
		public int read() {
			read.lock();
			System.out.println(Thread.currentThread()+ " read :begin "
			     + sdf.format(new Date()));
			try {
				Thread.sleep(5000);
				//
			}
			catch (Exception e) {
			}
			finally {
				System.out.println(Thread.currentThread() + " read :end "
				      + sdf.format(new Date()));
				read.unlock();
			}
			return 1;
		}
	}
}

テスト結果:


Thread[Thread-2,5,main] read :begin 2018-01-22 13:54:16.794 Thread[Thread-1,5,main] read :begin 2018-01-22 13:54:16.794 Thread[Thread-2,5,main] read :end 2018-01-22 13:54:21.795 Thread[Thread-1,5,main] read :end 2018-01-22 13:54:21.795 Thread[Thread-0,5,main] write:begin 2018-01-22 13:54:21.795 Thread[Thread-0,5,main] write:end 2018-01-22 13:54:26.795

テスト結果の解読:


同時に3つのスレッドが起動する、そのうち1番のスレッドThread[Thread-0,5,main],がwriteを実行するときに2秒間休止した.2,3番スレッドThread[Thread-1,5,main],Thread[Thread-2,5,main]がコードを優先的に実行します

read.lock();
read.lock();は反発しない(再入力可能)ため、同時にロックを手に入れ、ログで見ることができます.

Thread[Thread-2,5,main] read :begin 2018-01-22 13:54:16.794
Thread[Thread-1,5,main] read :begin 2018-01-22 13:54:16.794

また、彼らが実行する時間のオーバーヘッドは同じ(テストコードではスリープ5秒)なので、同時に実行が終了します.

Thread[Thread-2,5,main] read :end 2018-01-22 13:54:21.795
Thread[Thread-1,5,main] read :end 2018-01-22 13:54:21.795

すべてのreadLockが解放されるとwriteLockはロックを受け取ることができ、このときThread[Thread-1,5,main],Thread[Thread-2,5,main]が実行されるとロックreadLockが解放される
だからThread[Thread-0,5,main]この時writeLockを手に入れて自分のビジネスコードを実行しました

Thread[Thread-0,5,main] write:begin 2018-01-22 13:54:21.795
Thread[Thread-0,5,main] write:end 2018-01-22 13:54:26.795

まとめ


以上、Java言語ReadWriteLockのプロパティインスタンステストのすべての内容について説明しました.興味のある方は引き続き当駅の他の関連テーマを参照することができます.不足点があれば、伝言を歓迎します.友达の本駅に対する支持に感谢します!