激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java多線程之讀寫鎖分離設計模式

Java多線程之讀寫鎖分離設計模式

2022-03-04 17:52冬日毛毛雨 Java教程

這篇文章主要介紹了Java多線程讀寫鎖分離設計模式,主要利用Java到嗎完成read read 并行化、read write 不允許、write write 不允許幾項任務,需要的朋友可以參考一下

主要完成任務:

  • 1.read read 并行化
  • 2.read write 不允許
  • 3.write write 不允許
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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();
            }
 
        }
    }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
public class ReadWriteLock {
 
    /**
     * 當前有幾個線程 在對它進行讀操作
     */
    private int readingReaders = 0;
    /**
     * 當前有幾個線程 等待讀操作
     */
    private int waitingReaders = 0;
 
    /**
     * 當前有幾個線程 正在寫操作
     */
    private int writingWriters = 0;
    /**
     * 當前有幾個線程 正在寫操作
     */
    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 {
            /**
             * 讓寫的線程先運行
             */
            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();
        }
    }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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;
    }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
 *
 * 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();
    }
}

結果:

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
...... 省略

到此這篇關于Java多線程之讀寫鎖分離設計模式的文章就介紹到這了,更多相關Java多線程 讀寫鎖分離內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/7021759134072569887

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 三级国产三级在线 | 久久久国产一区二区三区 | 成人性生活视频在线观看 | 性欧美性欧美 | 在线观看中文字幕av | 羞羞视频免费网站 | 日日爱夜夜操 | 一级黄色片武则天 | 在线中文字幕亚洲 | 男女生羞羞视频网站在线观看 | 特黄一区二区三区 | 日本一级黄色大片 | 51色视频| 久草在线播放视频 | 亚洲午夜1000理论片aa | 少妇色诱麻豆色哟哟 | 渔夫荒淫艳史 | 一级做a在线观看 | 精品午夜久久 | 国产色片| 日韩在线视频导航 | 成人毛片在线 | 国产亚洲精品久久久久久久久久 | 香蕉久久久久久 | 欧美成人一级 | 中文字幕在线日韩 | 91精品国产九九九久久久亚洲 | 国产精品av久久久久久网址 | 草草视频免费观看 | 91视频观看免费 | 999久久久 | 免费香蕉成视频成人网 | 欧美成人精品欧美一级 | 欧日韩在线视频 | 久久亚洲国产精品 | 久久久久亚洲精品 | 天堂成人国产精品一区 | 精品在线免费播放 | 欧美一级特黄aaaaaaa什 | 久久国产精品99久久人人澡 | 中文字幕亚洲情99在线 |