2021版Java多线程教程
全集
2021版Java多线程教程
代码
RWDictionary.class
复制代码
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
99package main; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 高并发容器 */ public class RWDictionary { /** * key-value容器 */ private final Map<String, Object> m = new HashMap<>(); /** * 读写锁 */ private final ReadWriteLock rwl = new ReentrantReadWriteLock(true); /** * 读锁 */ private final Lock r = rwl.readLock(); /** * 写锁 */ private final Lock w = rwl.writeLock(); /** * 返回键对应的值。 * * @param key 键。 * @return 键对应的值。 */ public Object get(String key) { // 获取读锁 r.lock(); try { // 返回键对应的值 return m.get(key); } finally { // 释放读锁 r.unlock(); } } /** * 返回所有的键。 * * @return 所有的键。 */ public String[] allKeys() { // 获取读锁 r.lock(); try { // 返回所有的键 return m.keySet().toArray(new String[0]); } finally { // 释放读锁 r.unlock(); } } /** * 添加键和值,并返回数据。 * * @param key 键。 * @param value 值。 * @return 返回添加的数据。 */ public Object put(String key, Object value) { // 获取写锁 w.lock(); try { // 添加数据 return m.put(key, value); } finally { // 释放写锁 w.unlock(); } } /** * 清空容器。 */ public void clear() { // 获取写锁 w.lock(); try { // 清空容器 m.clear(); } finally { // 释放写锁 w.unlock(); } } }
WriteTask.class
复制代码
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
32package main; public class WriteTask implements Runnable { /** * 高并发容器 */ private RWDictionary dictionary; public WriteTask(RWDictionary dictionary) { this.dictionary = dictionary; } @Override public void run() { // 计数器 int i = 0; // 无限写入 while (true) { try { // 使当前线程休眠1秒钟 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 获取当前线程名称 String name = Thread.currentThread().getName(); // 存储数据 dictionary.put("人人都是程序员", name + "---" + i++); } } }
ReadTask.class
复制代码
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
33package main; public class ReadTask implements Runnable { /** * 高并发容器 */ private RWDictionary dictionary; public ReadTask(RWDictionary dictionary) { this.dictionary = dictionary; } @Override public void run() { // 无限读取 while (true) { try { // 使当前线程休眠1秒钟 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 获取所有的key String[] keys = dictionary.allKeys(); // 遍历所有的key for (String key : keys) { Object value = dictionary.get(key); System.out.println(key + ":" + value); } } } }
Main.class
复制代码
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
27package main; public class Main { public static void main(String[] args) { // 创建高并发容器 RWDictionary dictionary = new RWDictionary(); // 创建读、写任务 WriteTask writeTask = new WriteTask(dictionary); ReadTask readTask = new ReadTask(dictionary); // 创建读、写线程 Thread writeThread0 = new Thread(writeTask); Thread writeThread1 = new Thread(writeTask); Thread writeThread2 = new Thread(writeTask); Thread readThread0 = new Thread(readTask); Thread readThread1 = new Thread(readTask); Thread readThread2 = new Thread(readTask); // 启动线程 writeThread0.start(); writeThread1.start(); writeThread2.start(); readThread0.start(); readThread1.start(); readThread2.start(); } }
最后
以上就是冷酷万宝路最近收集整理的关于2021版Java多线程教程29:读写锁实战高并发容器全集代码的全部内容,更多相关2021版Java多线程教程29内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复