Java多線程之readwritelock讀寫分離的實(shí)現(xiàn)代碼
在多線程開發(fā)中,經(jīng)常會(huì)出現(xiàn)一種情況,我們希望讀寫分離。就是對(duì)于讀取這個(gè)動(dòng)作來說,可以同時(shí)有多個(gè)線程同時(shí)去讀取這個(gè)資源,但是對(duì)于寫這個(gè)動(dòng)作來說,只能同時(shí)有一個(gè)線程來操作,而且同時(shí),當(dāng)有一個(gè)寫線程在操作這個(gè)資源的時(shí)候,其他的讀線程是不能來操作這個(gè)資源的,這樣就極大的發(fā)揮了多線程的特點(diǎn),能很好的將多線程的能力發(fā)揮出來。
在Java中,ReadWriteLock這個(gè)接口就為我們實(shí)現(xiàn)了這個(gè)需求,通過他的實(shí)現(xiàn)類ReentrantReadWriteLock我們可以很簡(jiǎn)單的來實(shí)現(xiàn)剛才的效果,下面我們使用一個(gè)例子來說明這個(gè)類的用法。
package com.bird.concursey.charpet3;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class PricesInfo {
private double price1;
private double price2;
private ReadWriteLock lock;
public PricesInfo() {
price1 = 1.0;
price2 = 2.0;
lock = new ReentrantReadWriteLock();
}
public double getPrice1() {
//讀取資源鎖定
lock.readLock().lock();
double value = price1;
lock.readLock().unlock();
return value;
}
public double getPrice2() {
lock.readLock().lock();
double value = price2;
lock.readLock().unlock();
return value;
}
public void setPrices(double price1, double price2) {
lock.writeLock().lock();
this.price1 = price1;
this.price2 = price2;
lock.writeLock().unlock();
}
}
下面是讀和寫兩個(gè)不同的類
package com.bird.concursey.charpet3;
public class Reader implements Runnable {
private PricesInfo pricesInfo;
public Reader(PricesInfo pricesInfo) {
this.pricesInfo = pricesInfo;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s: Price 1: %f\n", Thread.currentThread()
.getName(), pricesInfo.getPrice1());
System.out.printf("%s: Price 2: %f\n", Thread.currentThread()
.getName(), pricesInfo.getPrice2());
}
}
}
package com.bird.concursey.charpet3;
public class Writer implements Runnable {
private PricesInfo pricesInfo;
public Writer(PricesInfo pricesInfo) {
this.pricesInfo = pricesInfo;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.printf("Writer: Attempt to modify the prices.\n");
pricesInfo.setPrices(Math.random() * 10, Math.random( ) * 8);
System.out.printf("Writer: Prices have been modified.\n");
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
PricesInfo pricesInfo = new PricesInfo();
Reader readers[] = new Reader[5];
Thread threadsReader[] = new Thread[5];
for (int i = 0; i < 5; i++){
readers[i] = new Reader(pricesInfo);
threadsReader[i] = new Thread(readers[i]);
}
Writer writer = new Writer(pricesInfo);
Thread threadWriter = new Thread(writer);
for (int i = 0; i < 5; i++){
threadsReader[i].start();
}
threadWriter.start();
}
}
總結(jié)
以上就是本文關(guān)于Java多線程之readwritelock讀寫分離的實(shí)現(xiàn)代碼的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以參閱:Java多線程阻塞與喚醒代碼示例 、 Java多線程ForkJoinPool實(shí)例詳解 、 詳解java中的互斥鎖信號(hào)量和多線程等待機(jī)制 、Java通過賣票理解多線程等,有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)腳本之家網(wǎng)站的支持。
- java并發(fā)編程專題(七)----(JUC)ReadWriteLock的用法
- Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解
- Java語言ReadWriteLock特性實(shí)例測(cè)試
- Java concurrency之共享鎖和ReentrantReadWriteLock_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java多線程編程之讀寫鎖ReadWriteLock用法實(shí)例
- Java并發(fā)編程之顯示鎖ReentrantLock和ReadWriteLock讀寫鎖
- Java基于ReadWriteLock實(shí)現(xiàn)鎖的應(yīng)用
相關(guān)文章
詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例
這篇文章主要介紹了詳解快速排序算法中的區(qū)間劃分法及Java實(shí)現(xiàn)示例,文中分別介紹了快排時(shí)兩種區(qū)間劃分的思路,需要的朋友可以參考下2016-04-04
詳解Elasticsearch如何實(shí)現(xiàn)簡(jiǎn)單的腳本排序
Elasticsearch?是位于?Elastic?Stack?核心的分布式搜索和分析引擎,可以為所有類型的數(shù)據(jù)提供近乎實(shí)時(shí)的搜索和分析。本文主要介紹了Elasticsearch如何實(shí)現(xiàn)簡(jiǎn)單的腳本排序,感興趣的可以了解一下2023-01-01
Java實(shí)現(xiàn)把文件及文件夾壓縮成zip
這篇文章主要介紹了Java實(shí)現(xiàn)把文件及文件夾壓縮成zip,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
SpringBoot集成RabbitMQ的方法(死信隊(duì)列)
這篇文章主要介紹了SpringBoot集成RabbitMQ的方法(死信隊(duì)列),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Java 對(duì)10個(gè)數(shù)進(jìn)行排序的實(shí)現(xiàn)代碼
可以利用選擇法,即從后9個(gè)比較過程中,選擇一個(gè)最小的與第一個(gè)元素交換, 下次類推,即用第二個(gè)元素與后8個(gè)進(jìn)行比較,并進(jìn)行交換2017-02-02
IDEA 2021配置JavaWeb項(xiàng)目超詳細(xì)教程
本文通過圖文并茂的形式給大家介紹IDEA 2021配置JavaWeb項(xiàng)目的過程,內(nèi)容簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-08-08

