Java多線程之讀寫鎖分離設(shè)計模式
主要完成任務(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)前有幾個線程 在對它進(jìn)行讀操作
*/
private int readingReaders = 0;
/**
* 當(dāng)前有幾個線程 等待讀操作
*/
private int waitingReaders = 0;
/**
* 當(dāng)前有幾個線程 正在寫操作
*/
private int writingWriters = 0;
/**
* 當(dāng)前有幾個線程 正在寫操作
*/
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è)計模式的文章就介紹到這了,更多相關(guān)Java多線程 讀寫鎖分離內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringTask-Timer實現(xiàn)定時任務(wù)的詳細(xì)代碼
在項目中開發(fā)定時任務(wù)應(yīng)該一種比較常見的需求,今天通過示例代碼給大家講解SpringTask-Timer實現(xiàn)定時任務(wù)的相關(guān)知識,感興趣的朋友一起看看吧2024-06-06
springboot加載復(fù)雜的yml文件獲取不到值的解決方案
這篇文章主要介紹了springboot加載復(fù)雜的yml文件獲取不到值的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
java查詢近七日數(shù)據(jù)功能的實現(xiàn)
這篇文章主要介紹了java查詢近七日數(shù)據(jù)功能的實現(xiàn),文章內(nèi)容詳細(xì),簡單易懂,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2023-01-01
Java運(yùn)行時數(shù)據(jù)區(qū)概述詳解
這篇文章主要介紹了Java運(yùn)行時數(shù)據(jù)區(qū)概述,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03

