概述
读写锁实现代码 读写锁实现线程安全的list
//读写锁实现
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底层是复制数组的原理,读写互不干扰而各自执行。完美提高并发效率。
利用复制数组的方式实现数组元素的修改 写效率低 读效率高 (读操作远多于写操作)
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方法的源码
这辈子坚持与不坚持都不可怕,怕的是独自走在坚持的道路上!!!
最后
以上就是眼睛大苗条为你收集整理的读写锁以及线程安全的集合的全部内容,希望文章能够帮你解决读写锁以及线程安全的集合所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复