Java多線程之readwritelock讀寫分離的實(shí)現(xiàn)代碼
在多線程開發(fā)中,經(jīng)常會(huì)出現(xiàn)一種情況,我們希望讀寫分離。就是對(duì)于讀取這個(gè)動(dòng)作來(lái)說(shuō),可以同時(shí)有多個(gè)線程同時(shí)去讀取這個(gè)資源,但是對(duì)于寫這個(gè)動(dòng)作來(lái)說(shuō),只能同時(shí)有一個(gè)線程來(lái)操作,而且同時(shí),當(dāng)有一個(gè)寫線程在操作這個(gè)資源的時(shí)候,其他的讀線程是不能來(lái)操作這個(gè)資源的,這樣就極大的發(fā)揮了多線程的特點(diǎn),能很好的將多線程的能力發(fā)揮出來(lái)。
在Java中,ReadWriteLock這個(gè)接口就為我們實(shí)現(xiàn)了這個(gè)需求,通過(guò)他的實(shí)現(xiàn)類ReentrantReadWriteLock我們可以很簡(jiǎn)單的來(lái)實(shí)現(xiàn)剛才的效果,下面我們使用一個(gè)例子來(lái)說(shuō)明這個(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通過(guò)賣票理解多線程等,有什么問(wèn)題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)腳本之家網(wǎng)站的支持。
- java并發(fā)編程專題(七)----(JUC)ReadWriteLock的用法
- Java多線程 ReentrantReadWriteLock原理及實(shí)例詳解
- Java語(yǔ)言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-01Java實(shí)現(xiàn)把文件及文件夾壓縮成zip
這篇文章主要介紹了Java實(shí)現(xiàn)把文件及文件夾壓縮成zip,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03SpringBoot集成RabbitMQ的方法(死信隊(duì)列)
這篇文章主要介紹了SpringBoot集成RabbitMQ的方法(死信隊(duì)列),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05簡(jiǎn)述Java編程語(yǔ)言對(duì)象的容納
這篇文章主要對(duì)Java編程思想中對(duì)象的容納進(jìn)行了一個(gè)總體的介紹,具有一定的參考價(jià)值,需要的朋友可以了解下。2017-09-09Java 對(duì)10個(gè)數(shù)進(jìn)行排序的實(shí)現(xiàn)代碼
可以利用選擇法,即從后9個(gè)比較過(guò)程中,選擇一個(gè)最小的與第一個(gè)元素交換, 下次類推,即用第二個(gè)元素與后8個(gè)進(jìn)行比較,并進(jìn)行交換2017-02-02IDEA 2021配置JavaWeb項(xiàng)目超詳細(xì)教程
本文通過(guò)圖文并茂的形式給大家介紹IDEA 2021配置JavaWeb項(xiàng)目的過(guò)程,內(nèi)容簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-08-08