国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java多線程基礎(八)——Read-Write Lock模式

snifes / 1708人閱讀

摘要:二模式案例類數據類可以被多個線程同時訪問。共享資源參與者代表和所共享的資源對象,提供不改變內部狀態的操作,以及會改變內部狀態的操作。讀寫鎖參與者提供了對參與者進行操作和操作時需要的鎖定。

一、定義

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

相關文章

  • 并發中的鎖文件模式

    摘要:序并發中的鎖文件模式是企業設計模式中的一種。可以是本地鎖,也可以分布式鎖,看文件系統是本地還是分布式的,算是一種比較古老的方式。代碼是原子操作要點檢查文件如果不存在則創建,要是原子操作,使用即可實現鎖占用過長怎么處理或者忘記解鎖怎么處理 序 并發中的鎖文件模式是Java企業設計模式中的一種。可以是本地鎖,也可以分布式鎖,看文件系統是本地還是分布式的,算是一種比較古老的方式。利用zk實現...

    weknow619 評論0 收藏0
  • Java線程進階()—— J.U.C之locks框架:AQS的Conditon等待(3)

    摘要:關于接口的介紹,可以參見多線程進階二鎖框架接口。最終線程釋放了鎖,并進入阻塞狀態。當線程被通知喚醒時,則是將條件隊列中的結點轉換成等待隊列中的結點,之后的處理就和獨占功能完全一樣。 showImg(https://segmentfault.com/img/remote/1460000016012490); 本文首發于一世流云的專欄:https://segmentfault.com/bl...

    ityouknow 評論0 收藏0
  • 淺談Java并發編程系列()—— LockSupport原理剖析

    摘要:此對象在線程受阻塞時被記錄,以允許監視工具和診斷工具確定線程受阻塞的原因。阻塞當前線程,最長不超過納秒,返回條件在的基礎上增加了超時返回。喚醒線程喚醒處于阻塞狀態的線程。 LockSupport 用法簡介 LockSupport 和 CAS 是Java并發包中很多并發工具控制機制的基礎,它們底層其實都是依賴Unsafe實現。 LockSupport是用來創建鎖和其他同步類的基本線程阻塞...

    jeyhan 評論0 收藏0
  • Java并發】Java并發編程與高并發基礎概念

    摘要:筆記來源并發編程與高并發解決方案并發基礎綜述多級緩存緩存一致性亂序執行優化內存模型規定抽象結構同步八種操作及規則并發的優勢與風險并發與高并發基本概念基本概念并發同時擁有兩個或者多個線程,如果程序在單核處理器上運行,多個線程將交替地換入或者換 筆記來源:【IMOOC】Java并發編程與高并發解決方案 并發基礎 綜述: CPU多級緩存:緩存一致性、亂序執行優化 Java內存模型:JM...

    stackfing 評論0 收藏0
  • 你和阿里資深架構師之間,差的不僅僅是年齡(進階必看)

    摘要:導讀閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己進行查漏補缺,覺得本文對你有幫助的話,可以點贊關注一下。目錄一基礎篇二進階篇三高級篇四架構篇五擴 導讀:閱讀本文需要有足夠的時間,筆者會由淺到深帶你一步一步了解一個資深架構師所要掌握的各類知識點,你也可以按照文章中所列的知識體系對比自身,對自己...

    huaixiaoz 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<