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

    你可能感兴趣的文章
    PFX(Parallel Framework) and Traditional Multithreading
    查看>>
    PGOS:今天动手给电脑装青苹果Win7 X64位系统
    查看>>
    pgpool-II3.1 的内存泄漏(一)
    查看>>
    PgSQL · 特性分析 · PG主备流复制机制
    查看>>
    PGSQL主键序列
    查看>>
    PGSQL安装PostGIS扩展模块
    查看>>
    pg数据库中两个字段相除
    查看>>
    PhalApi:[1.23] 请求和响应:GET和POST两者皆可得及超越JSON格式返回
    查看>>
    Phalcon环境搭建与项目开发
    查看>>
    Phantom.js维护者退出,项目的未来成疑
    查看>>
    Pharmaceutical的同学们都看过来,关于补码运算的复习相关内容
    查看>>
    Phoenix 查看表信息及修改元数据
    查看>>
    phoenix_执行sql报错_Error: ERROR 504 (42703): Undefined column. columnName=(state=4270_大数据工作笔记0181
    查看>>
    phoenix启动失败_The history file `/root/.sqlline/history` may be an older history---记录024_大数据工作笔记0184
    查看>>
    Phoenix基础命令_视图映射和表映射_数字存储问题---大数据之Hbase工作笔记0036
    查看>>
    phoenix无法连接hbase shell创建表失败_报错_PleaseHoldException: Master is initializing---记录020_大数据工作笔记0180
    查看>>
    Phoenix简介_安装部署_以及连接使用---大数据之Hbase工作笔记0035
    查看>>
    phoenix连接hbase报错Can not resolve hadoop120, please check your network_记录026---大数据工作笔记0187
    查看>>
    Photoshop工作笔记001---Photoshop常用快捷键总结
    查看>>
    Reids配置文件redis.conf中文详解
    查看>>