博客
关于我
聊聊并发-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/

    你可能感兴趣的文章
    python中 urllib, urllib2, httplib, httplib2 几个库的区别
    查看>>
    python中 yaml库 & json库 & xmltodict库使用
    查看>>
    python中 将你的名字转化成为二进制并输出
    查看>>
    Python中*args 和**kwargs的用法
    查看>>
    Python中*args 和**kwargs的用法
    查看>>
    Python中*args和**kwargs的使用
    查看>>
    python中0、1、True、False、if条件
    查看>>
    python中argparse模块关于 parse_args() 函数详解(全)
    查看>>
    python中base64编码与解码
    查看>>
    python中break怎么用_详解Python中break语句的用法
    查看>>
    python中del函数的垃圾回收
    查看>>
    Python中DrissionPage的详细解析与实战
    查看>>
    python中enumerate、变量类型转换
    查看>>
    python中execute是啥_python – 为什么“c.execute(…)”打破循环?
    查看>>
    python中exit和break区别_Python中exit()和sys.exit()之间的区别
    查看>>
    python中h5的用法
    查看>>
    python中http协议编程_HTTP编程
    查看>>
    python中import os_Python:相对导入与绝对导入(import)、os.path、__file__
    查看>>
    python中is和==操作符
    查看>>
    Python中range对象的使用以及打印九九乘法表
    查看>>