返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java 并发集合背后的原理与实现
  • 0
分享到

Java 并发集合背后的原理与实现

摘要

并发集合概述 在多线程编程中,多个线程可能同时访问和修改共享数据,这可能导致数据不一致或程序崩溃。为了解决这个问题,Java 提供了并发集合类,这些集合类实现了线程安全,可以确保在多线程环境下对数据的并发访问和修改是安全的。 CopyOn

并发集合概述

多线程编程中,多个线程可能同时访问和修改共享数据,这可能导致数据不一致或程序崩溃。为了解决这个问题,Java 提供了并发集合类,这些集合类实现了线程安全,可以确保在多线程环境下对数据的并发访问和修改是安全的。

CopyOnWriteArrayList

CopyOnWriteArrayList 是一个线程安全的 ArrayList 实现,它使用写时复制的策略来保证线程安全。在写时复制策略中,当一个线程试图修改 CopyOnWriteArrayList 时,会创建一个新的 ArrayList 实例,并将原有集合中的元素复制到新的实例中。然后,对新实例进行修改,原有集合保持不变。这种策略保证了在多线程环境下对 CopyOnWriteArrayList 的修改是原子的,不会导致数据不一致。

演示代码:

import java.util.concurrent.CopyOnWriteArrayList;

public class CopyOnWriteArrayListExample {

    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        list.add("Item 1");
        list.add("Item 2");
        list.add("Item 3");

        // 创建一个新的线程并尝试修改 list
        Thread thread = new Thread(() -> {
            list.add("Item 4");
        });
        thread.start();

        // 主线程继续对 list 进行修改
        list.add("Item 5");

        // 打印最终的 list
        System.out.println(list);
    }
}

输出结果:

[Item 1, Item 2, Item 3, Item 5, Item 4]

在这个例子中,主线程和新线程同时对 list 进行修改,但由于 CopyOnWriteArrayList 使用写时复制的策略,因此这两个线程的修改都是原子的,不会导致数据不一致。

ConcurrentHashMap

ConcurrentHashMap 是一个线程安全的 HashMap 实现,它使用分段来保证线程安全。在 ConcurrentHashMap 中,哈希表被划分为多个段,每个段都有自己的锁。当一个线程试图修改 ConcurrentHashMap 时,它会先获取相应段的锁,然后对该段进行修改。这种策略保证了在多线程环境下对 ConcurrentHashMap 的修改是原子的,不会导致数据不一致。

演示代码:

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapExample {

    public static void main(String[] args) {
        ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
        map.put("Item 1", 1);
        map.put("Item 2", 2);
        map.put("Item 3", 3);

        // 创建一个新的线程并尝试修改 map
        Thread thread = new Thread(() -> {
            map.put("Item 4", 4);
        });
        thread.start();

        // 主线程继续对 map 进行修改
        map.put("Item 5", 5);

        // 打印最终的 map
        System.out.println(map);
    }
}

输出结果:

{Item 1=1, Item 2=2, Item 3=3, Item 5=5, Item 4=4}

在这个例子中,主线程和新线程同时对 map 进行修改,但由于 ConcurrentHashMap 使用分段锁的策略,因此这两个线程的修改都是原子的,不会导致数据不一致。

ConcurrentLinkedQueue

ConcurrentLinkedQueue 是一个线程安全的 LinkedQueue 实现,它使用 CAS(CompareAndSet)操作来保证线程安全。在 ConcurrentLinkedQueue 中,队列中的元素通过一个链表连接起来,每个元素都有一个指向下一个元素的指针。当一个线程试图修改 ConcurrentLinkedQueue 时,它会先尝试使用 CAS 操作来更新指针,如果 CAS 操作成功,则修改成功;否则,线程将重试。这种策略保证了在多线程环境下对 ConcurrentLinkedQueue 的修改是原子的,不会导致数据不一致。

演示代码:

import java.util.concurrent.ConcurrentLinkedQueue;

public class ConcurrentLinkedQueueExample {

    public static void main(String[] args) {
        ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
        queue.add("Item 1");
        queue.add("Item 2");
        queue.add("Item 3");

        // 创建一个新的线程并尝试修改 queue
        Thread thread = new Thread(() -> {
            queue.add("Item 4");
        });
        thread.start();

        // 主线程继续对 queue 进行修改
        queue.add("Item 5");

        // 打印最终的 queue
        System.out.println(queue);
    }
}

输出结果:

[Item 1, Item 2, Item 3, Item 5, Item 4]

在这个例子中,主线程和新线程同时对 queue 进行修改,但由于 ConcurrentLinkedQueue 使用 CAS 操作的策略,因此这两个线程的修改都是原子的,不会导致数据不一致。

--结束END--

本文标题: Java 并发集合背后的原理与实现

本文链接: https://www.lsjlt.com/news/561838.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作