读写锁实现代码 读写锁实现线程安全的list
复制代码
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//读写锁实现 class MyList extends ArrayList{ ReadWriteLock rwl = new ReentrantReadWriteLock(); //读写锁 读的时候不能写,写的时候不能读 Lock rl = rwl.readLock(); //读锁 互斥锁,分配一次 //读锁写锁是一对的(假设没线程调用写锁的情况下,读锁的钥匙不是一把。读锁可以被反复分配,是一把共享锁) Lock wl = rwl.writeLock(); //写锁 互斥锁,分配一次 //线程在写的情况下,其他线程无法读 写锁没有分配的情况下(读锁可以多分配) ==>读写分离 //实现高并发线程安全的集合 @Override public int size() { try{ rl.lock(); return super.size(); } finally{ rl.unlock(); } } @Override public Object get(int index) { try{ rl.lock(); return super.get(index); } finally{ rl.unlock(); } } @Override public boolean add(Object e) { try{ wl.lock(); return super.add(e); } finally{ wl.unlock(); } } @Override public Object remove(int index) { try{ wl.lock(); return super.remove(index); } finally{ wl.unlock(); } } @Override public void clear() { try{ wl.lock(); super.clear(); } finally{ wl.unlock(); } } }
使用线程安全的集合替换读写锁实现的线程安全的方式,使用读写锁也会带来效率低下的缺点。举个例子,使用读写锁在写锁的情况下无法获取读锁。而CopyOnWriteArrayList底层是复制数组的原理,读写互不干扰而各自执行。完美提高并发效率。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15利用复制数组的方式实现数组元素的修改 写效率低 读效率高 (读操作远多于写操作) CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); //不加锁 list.add("a"); list.get(1); //数组实现的set 元素不可重复 // CopyOnWriteArraySet copyOnWriteArraySet = new CopyOnWriteArraySet(); //实现思想 分段锁 16个锁分段 ConcurrentHashMap<Object,Object> concurrentHashMap = new ConcurrentHashMap<>(); //Queue 队列 链表实现的队列 线程安全队列接口的实现类 cas算法 比较交换算法 ==》无锁算法实现线程安全 ConcurrentLinkedQueue<Object> objects = new ConcurrentLinkedQueue<>();
CopyOnWriteArraySet 中add方法的源码
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!
最后
以上就是眼睛大苗条最近收集整理的关于读写锁以及线程安全的集合的全部内容,更多相关读写锁以及线程安全内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复