Java語(yǔ)言ReadWriteLock特性實(shí)例測(cè)試
本文研究的主要是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釋放鎖之后才可以拿到
測(cè)試代碼
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;
}
}
}
測(cè)試結(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
測(cè)試結(jié)果解讀:
同時(shí)啟動(dòng)了3個(gè)線程,其中1號(hào)線程Thread[Thread-0,5,main],執(zhí)行write時(shí)先休眠了2秒.那么 2,3號(hào)線程Thread[Thread-1,5,main],Thread[Thread-2,5,main]將會(huì)優(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í)間開銷是相同的(測(cè)試代碼中都是休眠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é)束后就會(huì)釋放鎖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語(yǔ)言ReadWriteLock特性實(shí)例測(cè)試的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能
在現(xiàn)代企業(yè)應(yīng)用開發(fā)中,數(shù)據(jù)的導(dǎo)入和導(dǎo)出是一項(xiàng)常見且重要的功能需求,Excel?作為一種廣泛使用的電子表格工具,常常被用來存儲(chǔ)和展示數(shù)據(jù),下面我們來看看如何使用Apache?POI和SpringBoot實(shí)現(xiàn)Excel文件上傳和解析功能吧2025-01-01
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),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
OpenFeign調(diào)用服務(wù)請(qǐng)求頭丟失Token的解決
這篇文章主要介紹了OpenFeign調(diào)用服務(wù)請(qǐng)求頭丟失Token的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
Maven Plugin的@Mojo和@Execute的具體使用
本文主要介紹了Maven Plugin的@Mojo和@Execute的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
使用springboot防止反編譯proguard+xjar
介紹了三種代碼混淆和加密工具的使用方法:ProGuard、Xjar和ClassFinal,ProGuard用于混淆Java字節(jié)碼,Xjar提供對(duì)JAR包內(nèi)資源的加密和動(dòng)態(tài)解密,而ClassFinal則支持直接加密JAR包或WAR包,通過預(yù)研和實(shí)際操作2024-11-11

