Java多線程之讀寫鎖分離設(shè)計(jì)模式
主要完成任務(wù):
- 1.
read read
并行化 - 2.
read write
不允許 - 3.
write write
不允許
public class ReaderWorker extends Thread { private final SharedData data; public ReaderWorker(SharedData data) { this.data = data; } @Override public void run() { while (true) { try { char[] readBuf = data.read(); System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readBuf)); } catch (InterruptedException e) { e.printStackTrace(); } } } }
public class ReadWriteLock { /** * 當(dāng)前有幾個(gè)線程 在對它進(jìn)行讀操作 */ private int readingReaders = 0; /** * 當(dāng)前有幾個(gè)線程 等待讀操作 */ private int waitingReaders = 0; /** * 當(dāng)前有幾個(gè)線程 正在寫操作 */ private int writingWriters = 0; /** * 當(dāng)前有幾個(gè)線程 正在寫操作 */ private int waitingWriters = 0; /** * 偏向于寫 */ private boolean preferWriter = true; public ReadWriteLock() { this(true); } public ReadWriteLock(boolean preferWriter) { this.preferWriter = preferWriter; } public synchronized void readLock() throws InterruptedException { this.waitingReaders++; try { /** * 讓寫的線程先運(yùn)行 */ while (writingWriters > 0||(preferWriter&&waitingWriters>0)) { this.wait(); } this.readingReaders++; } finally { this.waitingReaders--; } } public synchronized void readUnLock() { this.readingReaders--; this.notifyAll(); } public synchronized void writeLock() throws InterruptedException { this.waitingWriters++; try { while (readingReaders > 0 || writingWriters > 0) { this.wait(); } this.writingWriters++; } finally { this.waitingWriters--; } } public synchronized void writeUnlock() { this.writingWriters--; this.notifyAll(); } } public class SharedData { private final char[] buffer; private final ReadWriteLock lock = new ReadWriteLock(); public SharedData(int size) { this.buffer = new char[size]; for (int i = 0; i < size; i++) { this.buffer[i] = '*'; } } public char[] read() throws InterruptedException { try { lock.readLock(); return this.doRead(); } finally { lock.readUnLock(); } } public void write(char c) throws InterruptedException { try { lock.writeLock(); this.doWrite(c); } finally { lock.writeUnlock(); } } private void doWrite(char c) { for (int i = 0; i < buffer.length; i++) { buffer[i] = c; slowly(10); } } private char[] doRead() { char[] newBuf = new char[buffer.length]; for (int i = 0; i < buffer.length; i++) { newBuf[i] = buffer[i]; } slowly(50); return newBuf; } private void slowly(int millisecond) { try { Thread.sleep(millisecond); } catch (InterruptedException e) { e.printStackTrace(); } } }
public class WriterWorker extends Thread { private static final Random random = new Random(System.currentTimeMillis()); private final SharedData data; private final String filter; private int index = 0; public WriterWorker(SharedData data, String filter) { this.data = data; this.filter = filter; } @Override public void run() { try { while (true) { char c = nextChar(); data.write(c); Thread.sleep(random.nextInt(1000)); } } catch (InterruptedException e) { e.printStackTrace(); } } private char nextChar() { char c = filter.charAt(index); index++; if (index >= filter.length()) index = 0; return c; } }
/** * * ReadWriteLock */ public class ReadWriteLockClient { public static void main(String[] args) { final SharedData sharedData = new SharedData(10); new ReaderWorker(sharedData).start(); new ReaderWorker(sharedData).start(); new ReaderWorker(sharedData).start(); new ReaderWorker(sharedData).start(); new ReaderWorker(sharedData).start(); new WriterWorker(sharedData,"123456").start(); new WriterWorker(sharedData,"abcdef").start(); } }
結(jié)果:
Thread-0 reads **********
Thread-1 reads **********
Thread-2 reads **********
Thread-3 reads **********
Thread-1 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-1 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-1 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-1 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-2 reads aaaaaaaaaa
Thread-0 reads aaaaaaaaaa
Thread-1 reads aaaaaaaaaa
Thread-3 reads aaaaaaaaaa
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-0 reads bbbbbbbbbb
Thread-1 reads bbbbbbbbbb
Thread-3 reads bbbbbbbbbb
Thread-2 reads bbbbbbbbbb
Thread-1 reads 3333333333
Thread-2 reads 3333333333
Thread-3 reads 3333333333
...... 省略
到此這篇關(guān)于Java多線程之讀寫鎖分離設(shè)計(jì)模式的文章就介紹到這了,更多相關(guān)Java多線程 讀寫鎖分離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用java實(shí)現(xiàn)telnet-client工具分享
這篇文章主要介紹了使用java實(shí)現(xiàn)telnet-client工具,需要的朋友可以參考下2014-03-03spring boot使用自定義的線程池執(zhí)行Async任務(wù)
這篇文章主要介紹了spring boot使用自定義的線程池執(zhí)行Async任務(wù)的相關(guān)資料,需要的朋友可以參考下2018-02-02SpringBoot基于AbstractRoutingDataSource實(shí)現(xiàn)多數(shù)據(jù)源動態(tài)切換
本文主要介紹了SpringBoot基于AbstractRoutingDataSource實(shí)現(xiàn)多數(shù)據(jù)源動態(tài)切換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05springboot 用監(jiān)聽器統(tǒng)計(jì)在線人數(shù)案例分析
這篇文章主要介紹了springboot 用監(jiān)聽器統(tǒng)計(jì)在線人數(shù)案例分析,質(zhì)是統(tǒng)計(jì)session 的數(shù)量,思路很簡單,具體實(shí)例代碼大家參考下本文2018-02-02Java實(shí)現(xiàn)醫(yī)院管理系統(tǒng)
這篇文章主要介為大家詳細(xì)紹了Java實(shí)現(xiàn)醫(yī)院管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12