摘要:二模式案例類數據類可以被多個線程同時訪問。共享資源參與者代表和所共享的資源對象,提供不改變內部狀態的操作,以及會改變內部狀態的操作。讀寫鎖參與者提供了對參與者進行操作和操作時需要的鎖定。
一、定義
Read-Write Lock Pattern將讀取與寫入分開處理,在讀取數據之前必須獲取用來讀取的鎖定,而寫入的時候必須獲取用來寫入的鎖定。因為讀取時實例的狀態不會改變,所以多個線程可以同時讀取;但是,寫入會改變實例的狀態,所以當有一個線程寫入的時候,其它線程既不能讀取與不能寫入。
二、模式案例Data類:
數據類可以被多個線程同時訪問。
public class Data { private final char[] buffer; private final ReadWriteLock lock = new ReadWriteLock(); public Data(int size) { this.buffer = new char[size]; for (int i = 0; i < buffer.length; i++) { buffer[i] = "*"; } } public char[] read() throws InterruptedException { lock.readLock(); try { return doRead(); } finally { lock.readUnlock(); } } public void write(char c) throws InterruptedException { lock.writeLock(); try { doWrite(c); } finally { lock.writeUnlock(); } } private char[] doRead() { char[] newbuf = new char[buffer.length]; for (int i = 0; i < buffer.length; i++) { newbuf[i] = buffer[i]; } slowly(); return newbuf; } private void doWrite(char c) { for (int i = 0; i < buffer.length; i++) { buffer[i] = c; slowly(); } } private void slowly() { try { Thread.sleep(50); } catch (InterruptedException e) { } } }
WriterThread類:
public class WriterThread extends Thread { private static final Random random = new Random(); private final Data data; private final String filler; private int index = 0; public WriterThread(Data data, String filler) { this.data = data; this.filler = filler; } public void run() { try { while (true) { char c = nextchar(); data.write(c); Thread.sleep(random.nextInt(3000)); } } catch (InterruptedException e) { } } private char nextchar() { char c = filler.charAt(index); index++; if (index >= filler.length()) { index = 0; } return c; } }
ReaderThread類:
public class ReaderThread extends Thread { private final Data data; public ReaderThread(Data data) { this.data = data; } public void run() { try { while (true) { char[] readbuf = data.read(); System.out.println(Thread.currentThread().getName() + " reads " + String.valueOf(readbuf)); } } catch (InterruptedException e) { } } }
ReadWriteLock類:
讀寫鎖需要防止以下兩類沖突:
“讀取”和“寫入”的沖突(read-write conflict)
“寫入”和“寫入”的沖突(write-write conflict)
注意:“讀取”和“讀取”之間不會沖突*
public final class ReadWriteLock { private int readingReaders = 0; //正在讀取線程的數量 private int writingWriters = 0; //正在寫入線程的數量 public synchronized void readLock() throws InterruptedException { while (writingWriters > 0 ) { wait(); } readingReaders++; } public synchronized void readUnlock() { readingReaders--; notifyAll(); } public synchronized void writeLock() throws InterruptedException { while (readingReaders > 0 || writingWriters > 0) { wait(); } writingWriters++; } public synchronized void writeUnlock() { writingWriters--; notifyAll(); } }
執行:
public class Main { public static void main(String[] args) { Data data = new Data(10); new ReaderThread(data).start(); new ReaderThread(data).start(); new ReaderThread(data).start(); new ReaderThread(data).start(); new ReaderThread(data).start(); new ReaderThread(data).start(); new WriterThread(data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ").start(); new WriterThread(data, "abcdefghijklmnopqrstuvwxyz").start(); } }三、模式講解
Read-Write Lock模式的角色如下:
Reader(讀取者)參與者
Reader參與者會對SharedResource進行讀。
Writer(寫入者)參與者
Writer參與者會對SharedResource進行寫。
SharedResource(共享資源)參與者
SharedResource代表Reader和Writer所共享的資源對象,SharedResource提供不改變內部狀態的read操作,以及會改變內部狀態的write操作。
ReadWriteLock(讀寫鎖)參與者
ReadWriteLock提供了對SharedResource參與者進行read操作和write操作時需要的鎖定。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71513.html
摘要:關于接口的介紹,可以參見多線程進階二鎖框架接口。最終線程釋放了鎖,并進入阻塞狀態。當線程被通知喚醒時,則是將條件隊列中的結點轉換成等待隊列中的結點,之后的處理就和獨占功能完全一樣。 showImg(https://segmentfault.com/img/remote/1460000016012490); 本文首發于一世流云的專欄:https://segmentfault.com/bl...
摘要:此對象在線程受阻塞時被記錄,以允許監視工具和診斷工具確定線程受阻塞的原因。阻塞當前線程,最長不超過納秒,返回條件在的基礎上增加了超時返回。喚醒線程喚醒處于阻塞狀態的線程。 LockSupport 用法簡介 LockSupport 和 CAS 是Java并發包中很多并發工具控制機制的基礎,它們底層其實都是依賴Unsafe實現。 LockSupport是用來創建鎖和其他同步類的基本線程阻塞...
摘要:筆記來源并發編程與高并發解決方案并發基礎綜述多級緩存緩存一致性亂序執行優化內存模型規定抽象結構同步八種操作及規則并發的優勢與風險并發與高并發基本概念基本概念并發同時擁有兩個或者多個線程,如果程序在單核處理器上運行,多個線程將交替地換入或者換 筆記來源:【IMOOC】Java并發編程與高并發解決方案 并發基礎 綜述: CPU多級緩存:緩存一致性、亂序執行優化 Java內存模型:JM...
摘要:導讀閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進行查漏補缺,覺得本文對你有幫助的話,可以點贊關注一下。目錄一基礎篇二進階篇三高級篇四架構篇五擴 導讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己...
閱讀 3323·2021-11-22 12:04
閱讀 2706·2019-08-29 13:49
閱讀 482·2019-08-26 13:45
閱讀 2238·2019-08-26 11:56
閱讀 998·2019-08-26 11:43
閱讀 587·2019-08-26 10:45
閱讀 1266·2019-08-23 16:48
閱讀 2157·2019-08-23 16:07