寒假打卡12-1月27日

Java CopyOnWrite 容器——CopyOnWriteArrayList、CopyOnWriteArraySet

在多线程环境中,读写操作的冲突是一个常见的问题。Java 提供了 CopyOnWrite 容器来解决这个问题,主要包括 CopyOnWriteArrayListCopyOnWriteArraySet。这些容器在进行写操作时会创建一个新的副本,从而避免了读写冲突,适用于读多写少的场景。

CopyOnWriteArrayList

CopyOnWriteArrayList 是一个线程安全的 List 实现,其内部通过复制数组来实现并发安全。在添加、删除或修改元素时,会复制原数组,并在副本上进行操作,最后将副本替换为原数组。

使用场景

  • 读操作远多于写操作的场景
  • 需要避免读写锁竞争的场景

示例代码

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListDemo {
    public static void main(String[] args) {
        List<String> list = new CopyOnWriteArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // 读操作
        for (String fruit : list) {
            System.out.println(fruit);
        }

        // 写操作
        list.add("Date");

        // 读操作
        for (String fruit : list) {
            System.out.println(fruit);
        }
    }
}

在上述代码中,我们创建了一个 CopyOnWriteArrayList,并进行了多次读写操作。由于每次写操作都会创建数组的副本,因此不会影响并发的读操作。

CopyOnWriteArraySet

CopyOnWriteArraySet 是一个线程安全的 Set 实现,其内部通过 CopyOnWriteArrayList 来实现并发安全。它具有 Set 的特性,即不允许重复元素。

使用场景

  • 读操作远多于写操作的场景
  • 需要避免读写锁竞争的场景
  • 需要保证元素唯一性的场景

示例代码

import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

public class CopyOnWriteArraySetDemo {
    public static void main(String[] args) {
        Set<String> set = new CopyOnWriteArraySet<>();
        set.add("Dog");
        set.add("Cat");
        set.add("Horse");

        // 读操作
        for (String animal : set) {
            System.out.println(animal);
        }

        // 写操作
        set.add("Elephant");

        // 读操作
        for (String animal : set) {
            System.out.println(animal);
        }
    }
}

在上述代码中,我们创建了一个 CopyOnWriteArraySet,并进行了多次读写操作。由于每次写操作都会创建数组的副本,因此不会影响并发的读操作。

CopyOnWrite 容器的优缺点

优点

  • 线程安全:通过复制数组避免读写冲突,确保线程安全。
  • 无需锁机制:读操作无需加锁,避免了读写锁竞争,提高了并发性能。
  • 读性能高:适用于读操作远多于写操作的场景,读性能非常高。

缺点

  • 内存开销大:每次写操作都会创建数组的副本,增加了内存开销。
  • 写性能低:写操作需要复制数组,性能较低,不适用于写操作频繁的场景。

总结

CopyOnWrite 容器在多线程环境下提供了一种高效的读写分离机制,适用于读操作远多于写操作的场景。通过使用 CopyOnWriteArrayListCopyOnWriteArraySet,我们可以避免读写冲突,提高并发性能。然而,由于其内存开销和写性能较低,不适用于写操作频繁的场景。

希望通过本篇文章,大家对 Java CopyOnWrite 容器有了更深入的了解。在接下来的文章中,我们将继续探讨更多关于 Java 并发编程的知识点,敬请期待!

posted @ 2025-01-27 09:09  aallofitisst  阅读(15)  评论(0)    收藏  举报