Java語(yǔ)言ReadWriteLock特性實(shí)例測(cè)試
本文研究的主要是ReadWriteLock特性,具體如下。
ReadWriteLock幾點(diǎn)特性
readLock 與 readLock 不互斥
readLock 與 writeLock 互斥
writeLock 與 readLock 互斥
writeLock 與 writeLock 互斥
舉例來(lái)說(shuō):
線程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);
//寫(xiě)
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í)拿到了鎖,通過(guò)日志可以看出來(lái)
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í)間開(kāi)銷(xiāo)是相同的(測(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)專(zhuān)題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Java調(diào)用ChatGPT的實(shí)現(xiàn)代碼
這篇文章主要介紹了Java調(diào)用ChatGPT的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02
Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例
這篇文章主要介紹了Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
java實(shí)現(xiàn)合并單元格的同時(shí)并導(dǎo)出excel示例
這篇文章主要給大家介紹了關(guān)于java實(shí)現(xiàn)合并單元格的同時(shí)并導(dǎo)出excel的相關(guān)資料,文中先進(jìn)行了簡(jiǎn)單的介紹,之后給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03
解決spring-data-jpa mysql建表編碼問(wèn)題
這篇文章主要介紹了解決spring-data-jpa mysql建表編碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
MySQL查詢(xún)字段實(shí)現(xiàn)字符串分割split功能的示例代碼
本文主要介紹了MySQL查詢(xún)字段實(shí)現(xiàn)字符串分割split功能的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟
這篇文章主要介紹了SpringAOP 設(shè)置注入的實(shí)現(xiàn)步驟,幫助大家更好的理解和學(xué)習(xí)使用Spring框架,感興趣的朋友可以了解下2021-05-05

