博客
关于我
聊聊并发-Java中的CopyOnWrite容器
阅读量:779 次
发布时间:2019-03-24

本文共 2540 字,大约阅读时间需要 8 分钟。

CopyOnWrite容器:高效的并发编程解决方案

CopyOnWrite容器的概念

CopyOnWrite(写时复制),是一种优化策略,主要用于解决共享资源的并发访问问题。在程序设计中,尤其是在多线程环境下,直接共享同一份资源可能导致竞态条件和死锁。CopyOnWrite通过复制资源的方式,实现了对共享资源的安全访问。

CopyOnWrite容器的实现原理

CopyOnWrite容器的核心思想是:当资源被修改时,首先创建一个新的副本,然后对副本进行操作。这种方式避免了直接操作共享资源的竞态条件问题。

CopyOnWriteArrayList的实现

为了更好地理解CopyOnWrite容器的工作原理,我们可以分析Java的CopyOnWriteArrayList。在添加元素时,容器会复制当前的数组,并在新数组中添加元素。原数组的引用随后被指向新数组。这种方式确保了读操作可以在不加锁的情况下进行,因为读操作始终操作的是旧数组。

public boolean add(T e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
Object[] elements = getArray();
int len = elements.length;
Object[] newElements = Arrays.copyOf(elements, len + 1);
newElements[len] = e;
setArray(newElements);
return true;
} finally {
lock.unlock();
}
}

CopyOnWriteMap的实现

为了满足更复杂的键值存储需求,我们可以实现一个简单的CopyOnWriteMap。其核心思想与CopyOnWriteArrayList类似:在修改时创建新副本,并对副本进行操作。

public class CopyOnWriteMap
implements Map
, Cloneable {
private volatile Map
internalMap;
public CopyOnWriteMap() {
internalMap = new HashMap
();
}
public V put(K key, V value) {
synchronized (this) {
Map
newMap = new HashMap
(internalMap); V val = newMap.put(key, value); internalMap = newMap; return val; } } public V get(Object key) { return internalMap.get(key); } public void putAll(Map
newData) { synchronized (this) { Map
newMap = new HashMap
(internalMap); newMap.putAll(newData); internalMap = newMap; } } }

CopyOnWrite容器的应用场景

CopyOnWrite容器在读多写少的并发场景中表现尤为出色。例如:

黑名单服务系统

package com.ifeve.book;
import java.util.Map;
import com.ifeve.book.forkjoin.CopyOnWriteMap;
public class BlackListServiceImpl {
private static CopyOnWriteMap
blackListMap = new CopyOnWriteMap
(1000);
public static boolean isBlackList(String id) {
return blackListMap.get(id) != null;
}
public static void addBlackList(String id) {
blackListMap.put(id, Boolean.TRUE);
}
public static void addBlackList(Map
ids) {
blackListMap.putAll(ids);
}
}

CopyOnWrite容器的优缺点

优点

  • 高效的读写分离:CopyOnWrite容器支持在不加锁的情况下进行读操作,从而减少了竞争条件。
  • 简单的实现:相比其他并发容器(如ConcurrentHashMap),CopyOnWrite容器的实现较为简单。
  • 缺点

  • 内存占用:写时复制会增加内存消耗,尤其是在处理大量数据时,可能导致GC问题。
  • 一致性问题:CopyOnWrite容器无法保证写入的数据能够实时读取。
  • CopyOnWrite容器的适用性

    CopyOnWrite容器适用于以下场景:

  • 读多写少的场景:适合需要频繁读取但少量写入的应用。
  • 对一致性要求不高的场景:适合不需要实时更新的场景。
  • 结论

    CopyOnWrite容器通过写时复制机制,为并发编程提供了一种高效的解决方案。它在读多写少的场景中表现优异,但在内存占用和一致性方面存在一定的局限性。开发者在使用时,需要根据具体需求权衡其优缺点。

    转载地址:http://wufuk.baihongyu.com/

    你可能感兴趣的文章
    Mysql:避免重复的插入数据方法汇总
    查看>>
    MyS中的IF
    查看>>
    M_Map工具箱简介及地理图形绘制
    查看>>
    m_Orchestrate learning system---二十二、html代码如何变的容易
    查看>>
    M×N 形状 numpy.ndarray 的滑动窗口
    查看>>
    m个苹果放入n个盘子问题
    查看>>
    n = 3 , while n , continue
    查看>>
    n 叉树后序遍历转换为链表问题的深入探讨
    查看>>
    N!
    查看>>
    N-Gram的基本原理
    查看>>
    n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
    查看>>
    Nacos Client常用配置
    查看>>
    nacos config
    查看>>
    Nacos Config--服务配置
    查看>>
    Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
    查看>>
    Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
    查看>>
    Nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3
    查看>>
    Nacos 启动报错[db-load-error]load jdbc.properties error
    查看>>
    Nacos 报Statement cancelled due to timeout or client request
    查看>>
    Nacos 注册服务源码分析
    查看>>