您好,登錄后才能下訂單哦!
在多線程開發(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)站的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。