一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费视频一级片 | 日本三级做a全过程在线观看 | 亚洲国产精品成人久久 | 国产精品合集一区二区 | 精品视频久久久久 | chinese男性厕所撒尿合集 | 免费观看网站 | 暖暖的免费观看高清视频韩国 | 欧美日本一本线在线观看 | 午夜在线观看免费完整直播网页 | 幻女free性摘花第一次 | 国产精品色片 | 日本javaajax| 轻轻操在线视频 | 国产精品亚洲片在线不卡 | 91精品大神国产在线播放 | 秋霞一级| 日韩在线观看免费 | 国产免费福利片 | 91香蕉视频导航 | 成年男女免费视频网站 | 欧美黑人性猛交╳xx╳动态图 | 日韩视频在线免费 | 亚洲国产日韩欧美mv | 五月天视频网 | 69成人网| 鬼惨笑小说| 国产性片在线观看 | 亚洲品质自拍视频 | 4虎影院永久地址www | 免费尤物视频 | 国产日产韩产麻豆1区 | 亚州成人| 欧美一区二区三区精品影视 | 肉蒲在线观看 | 欧美va在线 | 国产精品久久久久久久久免费hd | 金莲你下面好紧夹得我好爽 | 九九久久国产精品大片 | 国产福利不卡视频在免费 | 国产午夜精品一区二区三区不卡 |