Java并发27:CopyOnWriteArrayList - 写时复制容器

核心原理:写时复制(Copy-On-Write) public class CopyOnWriteArrayList<E> { private volatile Object[] array; // 底层数组 public boolean add(E e) { synchronized (lock) { Object[] oldArray = getArray(); int len = oldArray.length; Object[] newArray = Arrays.copyOf(oldArray, len + 1); // 复制 newArray[len] = e; setArray(newArray); // 切换 return true; } } public E get(int index) { return get(getArray(), index); // 无锁读取 } } 核心思想: 读:直接读,无锁 写:复制整个数组,修改副本,切换引用 适用场景 场景1:黑白名单 public class BlackList { private final CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>(); public void add(String ip) { list.add(ip); // 很少写 } public boolean contains(String ip) { return list.contains(ip); // 频繁读 } } 场景2:监听器列表 public class EventPublisher { private final CopyOnWriteArrayList<EventListener> listeners = new CopyOnWriteArrayList<>(); public void addListener(EventListener listener) { listeners.add(listener); // 很少添加 } public void publishEvent(Event event) { for (EventListener listener : listeners) { // 频繁遍历 listener.onEvent(event); } } } 场景3:配置管理 public class ConfigManager { private final CopyOnWriteArrayList<Config> configs = new CopyOnWriteArrayList<>(); public void updateConfig(Config config) { configs.add(config); // 偶尔更新 } public Config getConfig(String key) { for (Config config : configs) { // 频繁查询 if (config.getKey().equals(key)) { return config; } } return null; } } 核心特性 1. 读操作无锁 // 读操作:直接访问volatile数组 public E get(int index) { return get(getArray(), index); // 无synchronized } public Iterator<E> iterator() { return new COWIterator<E>(getArray(), 0); // 快照迭代器 } 2. 写操作加锁 // 写操作:加锁 + 复制 public boolean add(E e) { synchronized (lock) { // 1. 复制原数组 Object[] oldArray = getArray(); int len = oldArray.length; Object[] newArray = Arrays.copyOf(oldArray, len + 1); // 2. 修改副本 newArray[len] = e; // 3. 切换引用(原子操作) setArray(newArray); return true; } } 3. 快照迭代器 // 迭代器基于创建时的快照 Iterator<String> it = list.iterator(); list.add("new"); // 不影响迭代器 while (it.hasNext()) { System.out.println(it.next()); // 不包含"new" } 特点: ...

2025-11-20 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...