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

資訊專欄INFORMATION COLUMN

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

snifes / 1713人閱讀

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

一、定義

Read-Write Lock Pattern將讀取與寫入分開處理,在讀取數(shù)據(jù)之前必須獲取用來讀取的鎖定,而寫入的時候必須獲取用來寫入的鎖定。因為讀取時實例的狀態(tài)不會改變,所以多個線程可以同時讀取;但是,寫入會改變實例的狀態(tài),所以當(dāng)有一個線程寫入的時候,其它線程既不能讀取與不能寫入。

二、模式案例

Data類:
數(shù)據(jù)類可以被多個線程同時訪問。

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;        //正在讀取線程的數(shù)量 
    private int writingWriters = 0;     //正在寫入線程的數(shù)量
    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();
    }
}

執(zhí)行:

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進(jìn)行讀。

Writer(寫入者)參與者

Writer參與者會對SharedResource進(jìn)行寫。

SharedResource(共享資源)參與者

SharedResource代表Reader和Writer所共享的資源對象,SharedResource提供不改變內(nèi)部狀態(tài)的read操作,以及會改變內(nèi)部狀態(tài)的write操作。

ReadWriteLock(讀寫鎖)參與者

ReadWriteLock提供了對SharedResource參與者進(jìn)行read操作和write操作時需要的鎖定。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71513.html

相關(guān)文章

  • 并發(fā)中的鎖文件模式

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

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

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

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

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

    jeyhan 評論0 收藏0
  • Java并發(fā)】Java并發(fā)編程與高并發(fā)基礎(chǔ)概念

    摘要:筆記來源并發(fā)編程與高并發(fā)解決方案并發(fā)基礎(chǔ)綜述多級緩存緩存一致性亂序執(zhí)行優(yōu)化內(nèi)存模型規(guī)定抽象結(jié)構(gòu)同步八種操作及規(guī)則并發(fā)的優(yōu)勢與風(fēng)險并發(fā)與高并發(fā)基本概念基本概念并發(fā)同時擁有兩個或者多個線程,如果程序在單核處理器上運(yùn)行,多個線程將交替地?fù)Q入或者換 筆記來源:【IMOOC】Java并發(fā)編程與高并發(fā)解決方案 并發(fā)基礎(chǔ) 綜述: CPU多級緩存:緩存一致性、亂序執(zhí)行優(yōu)化 Java內(nèi)存模型:JM...

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

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

    huaixiaoz 評論0 收藏0

發(fā)表評論

0條評論

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