欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java語言ReadWriteLock特性實(shí)例測試

 更新時(shí)間:2018年02月11日 10:52:23   作者:Alioo-壞人  
這篇文章主要介紹了Java語言ReadWriteLock特性實(shí)例測試,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下

本文研究的主要是ReadWriteLock特性,具體如下。

ReadWriteLock幾點(diǎn)特性

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;
		}
	}
}

測試結(jié)果:

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

測試結(jié)果解讀:

同時(shí)啟動了3個(gè)線程,其中1號線程Thread[Thread-0,5,main],執(zhí)行write時(shí)先休眠了2秒.那么 2,3號線程Thread[Thread-1,5,main],Thread[Thread-2,5,main]將會優(yōu)先執(zhí)行代碼

read.lock();

由于read.lock();是不互斥的(即可重入的),所以他們同時(shí)拿到了鎖,通過日志可以看出來

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

而且他們執(zhí)行的時(shí)間開銷是相同的(測試代碼中都是休眠5秒),所以也將同時(shí)執(zhí)行結(jié)束

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

只有當(dāng)所有的readLock被釋放掉之后,writeLock才能拿到鎖,而這個(gè)時(shí)候Thread[Thread-1,5,main],Thread[Thread-2,5,main]執(zhí)行結(jié)束后就會釋放鎖readLock

所以Thread[Thread-0,5,main]這個(gè)時(shí)候拿到了writeLock并執(zhí)行自己的業(yè)務(wù)代碼

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

總結(jié)

以上就是本文關(guān)于Java語言ReadWriteLock特性實(shí)例測試的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • Java調(diào)用ChatGPT的實(shí)現(xiàn)代碼

    Java調(diào)用ChatGPT的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java調(diào)用ChatGPT的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例

    Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例

    這篇文章主要介紹了Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • java編程之xpath介紹

    java編程之xpath介紹

    這篇文章主要介紹了java編程之xpath介紹,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • java實(shí)現(xiàn)合并單元格的同時(shí)并導(dǎo)出excel示例

    java實(shí)現(xiàn)合并單元格的同時(shí)并導(dǎo)出excel示例

    這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)合并單元格的同時(shí)并導(dǎo)出excel的相關(guān)資料,文中先進(jìn)行了簡單的介紹,之后給出了詳細(xì)的示例代碼,相信對大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • 解決spring-data-jpa mysql建表編碼問題

    解決spring-data-jpa mysql建表編碼問題

    這篇文章主要介紹了解決spring-data-jpa mysql建表編碼問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring?Lifecycle的使用小結(jié)

    Spring?Lifecycle的使用小結(jié)

    這篇文章主要介紹了Spring?Lifecycle的使用,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • Java編程接口詳細(xì)

    Java編程接口詳細(xì)

    這篇文章主要小編主要給大家講解的是Java編程中的接口,文章會從抽象類和抽象方法開始展開內(nèi)容,感興趣的小伙伴可以參考下面文章的具體內(nèi)容
    2021-10-10
  • MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼

    MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼

    本文主要介紹了MySQL查詢字段實(shí)現(xiàn)字符串分割split功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java面試之線程通訊方式詳解

    Java面試之線程通訊方式詳解

    線程通信是指多個(gè)線程之間通過某種機(jī)制進(jìn)行協(xié)調(diào)和交互,那為什么一個(gè)線程等待和通知機(jī)制就需要這么多的實(shí)現(xiàn)方式呢?別著急,下面小編來和大家仔細(xì)聊聊
    2023-08-08
  • SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟

    SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟

    這篇文章主要介紹了SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用Spring框架,感興趣的朋友可以了解下
    2021-05-05

最新評論