最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

本文研究的主要是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é)果解讀:

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

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

而且他們執(zhí)行的時間開銷是相同的(測試代碼中都是休眠5秒),所以也將同時執(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才能拿到鎖,而這個時候Thread[Thread-1,5,main],Thread[Thread-2,5,main]執(zhí)行結(jié)束后就會釋放鎖readLock

所以Thread[Thread-0,5,main]這個時候拿到了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關(guān)閉流連接IO工具類

    java關(guān)閉流連接IO工具類

    這篇文章主要為大家詳細(xì)介紹了java關(guān)閉流連接IO工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Java深入講解SPI的使用

    Java深入講解SPI的使用

    SPI英文全稱為Service Provider Interface,顧名思義,服務(wù)提供者接口,它是jdk提供給“服務(wù)提供廠商”或者“插件開發(fā)者”使用的接口
    2022-06-06
  • SpringBoot中熱部署配置深入講解原理

    SpringBoot中熱部署配置深入講解原理

    在實(shí)際開發(fā)中,每次修改代碼就需要重啟項(xiàng)目,重新部署,對于一個后端開發(fā)者來說,重啟確實(shí)很難受。在java開發(fā)領(lǐng)域,熱部署一直是一個難以解決的問題,目前java虛擬機(jī)只能實(shí)現(xiàn)方法體的熱部署,對于整個類的結(jié)構(gòu)修改,仍然需要重啟項(xiàng)目
    2023-01-01
  • 使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能

    使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能

    在現(xiàn)代企業(yè)應(yīng)用開發(fā)中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是一項(xiàng)常見且重要的功能需求,Excel?作為一種廣泛使用的電子表格工具,常常被用來存儲和展示數(shù)據(jù),下面我們來看看如何使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能吧
    2025-01-01
  • Java transient關(guān)鍵字與序列化操作實(shí)例詳解

    Java transient關(guān)鍵字與序列化操作實(shí)例詳解

    這篇文章主要介紹了Java transient關(guān)鍵字與序列化操作,結(jié)合實(shí)例形式詳細(xì)分析了java序列化操作相關(guān)實(shí)現(xiàn)方法與操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • 基于Ant路徑匹配規(guī)則AntPathMatcher的注意事項(xiàng)

    基于Ant路徑匹配規(guī)則AntPathMatcher的注意事項(xiàng)

    這篇文章主要介紹了基于Ant路徑匹配規(guī)則AntPathMatcher的注意事項(xiàng),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • OpenFeign調(diào)用服務(wù)請求頭丟失Token的解決

    OpenFeign調(diào)用服務(wù)請求頭丟失Token的解決

    這篇文章主要介紹了OpenFeign調(diào)用服務(wù)請求頭丟失Token的解決方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java 集合概覽(小結(jié))

    Java 集合概覽(小結(jié))

    這篇文章主要介紹了Java 集合概覽(小結(jié)),詳細(xì)的介紹了集合的概念和接口等。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Maven Plugin的@Mojo和@Execute的具體使用

    Maven Plugin的@Mojo和@Execute的具體使用

    本文主要介紹了Maven Plugin的@Mojo和@Execute的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 使用springboot防止反編譯proguard+xjar

    使用springboot防止反編譯proguard+xjar

    介紹了三種代碼混淆和加密工具的使用方法:ProGuard、Xjar和ClassFinal,ProGuard用于混淆Java字節(jié)碼,Xjar提供對JAR包內(nèi)資源的加密和動態(tài)解密,而ClassFinal則支持直接加密JAR包或WAR包,通過預(yù)研和實(shí)際操作
    2024-11-11

最新評論

永修县| 边坝县| 昌平区| 三原县| 麻阳| 汪清县| 大庆市| 永靖县| 兴业县| 鄂尔多斯市| 拜泉县| 潮安县| 安西县| 固阳县| 遂川县| 平原县| 佛冈县| 西安市| 云林县| 浑源县| 镇安县| 东乡| 岫岩| 来凤县| 嘉荫县| 遂溪县| 望谟县| 乌海市| 襄城县| 东光县| 仁寿县| 沧州市| 海安县| 怀化市| 东乌珠穆沁旗| 五大连池市| 新竹市| 葫芦岛市| 子洲县| 新绛县| 江北区|