JAVA-基础语法-多线程基础-CopyOnWriteArrayList -1
【摘要】 JAVA-基础语法-多线程基础-CopyOnWriteArrayList -1
CopyOnWriteArrayList适用于写少读多的并发场景
1、读多写少的场景下引发的问题?
大家可以设想一下现在我们的内存里有一个ArrayList,这个ArrayList默认情况下肯定是线程不安全的,要是多个线程并发读和写这个ArrayList可能会有问题。
好,问题来了,我们应该怎么让这个ArrayList变成线程安全的呢?
有一个非常简单的办法,对这个ArrayList的访问都加上线程同步的控制。
比如说一定要在synchronized代码段来对这个ArrayList进行访问,这样的话,就能同一时间就让一个线程来操作它了,或者是用ReadWriteLock读写锁的方式来控制,都可以。
我们假设就是用ReadWriteLock读写锁的方式来控制对这个ArrayList的访问。
这样多个读请求可以同时执行从ArrayList里读取数据,但是读请求和写请求之间互斥,写请求和写请求也是互斥的。
大家看看,代码大概就是类似下面这样:
public Object read() {
lock.readLock().lock();
// 对ArrayList读取
lock.readLock().unlock();
}
public void write() {
lock.writeLock().lock();
// 对ArrayList写
lock.writeLock().unlock();
}
大家想想,类似上面的代码有什么问题呢?
最大的问题,其实就在于写锁和读锁的互斥。假设写操作频率很低,读操作频率很高,是写少读多的场景。
那么偶尔执行一个写操作的时候,是不是会加上写锁,此时大量的读操作过来是不是就会被阻塞住,无法执行?
这个就是读写锁可能遇到的最大的问题。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)