博客
关于我
聊聊并发-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级联删除_Mysql笔记系列,DQL基础复习,Mysql的约束与范式
    查看>>
    mysql练习语句
    查看>>
    mysql经常使用命令
    查看>>
    MySQL经常使用技巧
    查看>>
    mysql给root开启远程访问权限,修改root密码
    查看>>
    mysql给账号授权相关功能 | 表、视图等
    查看>>
    MySQL缓存使用率超过80%的解决方法
    查看>>
    Mysql缓存调优的基本知识(附Demo)
    查看>>
    mysql编写存储过程
    查看>>
    mysql网站打开慢问题排查&数据库优化
    查看>>
    mysql网络部分代码
    查看>>
    mysql联合索引 where_mysql联合索引与Where子句优化浅析
    查看>>
    mysql联合索引的最左前缀匹配原则
    查看>>
    MySQL聚簇索引
    查看>>
    mysql自动化同步校验_Shell: 分享MySQL数据同步+主从复制自动化脚本_20190313_七侠镇莫尛貝...
    查看>>
    Mysql自增id理解
    查看>>