Collections.synchronizedX() 与 ConcurrentX:到底该用谁?(避免死磕死锁)

测试智商的网站 2天前 阅读数 7707 #在线测试

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

哎,你是不是也碰到过这种情况?
刚接手的项目里,代码一堆Collections.synchronizedList(),还以为挺安全的,结果在并发量高的时候,性能直接掉进了“黑洞”。
于是,你开始考虑换个更牛逼的工具——Concurrent Collections,但是这俩是啥关系呢?它们到底各自有啥“秘密武器”?
今天就让咱们深入剖析这两种并发集合工具,看看它们到底有什么区别,什么时候使用合适,别再“踩坑”了!

一、Collections.synchronizedX() 简介:传统方式的“锁”策略

什么是 Collections.synchronizedX()

Collections.synchronizedX() 是 Java 提供的对集合类进行同步包装的工具方法,它是通过内部加锁来保证并发环境下的线程安全。

用法示例:

List<String> list = Collections.synchronizedList(new ArrayList<>());

工作原理:

  • 它使用同步锁来保证线程安全,每次对集合的操作(比如add()remove()等)都会加锁
  • 由于同步机制是通过synchronized实现的,所以只有一个线程可以访问集合,其他线程必须排队等待。

示例代码:

List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());

synchronizedList.add("Hello");
synchronizedList.add("World");

synchronized (synchronizedList) {
    // 需要手动加锁遍历
    for (String item : synchronizedList) {
        System.out.println(item);
    }
}

关键点

  • synchronizedX() 本质上是使用 内部锁 来保证集合的线程安全性
  • 它在多线程环境下保证了可见性互斥性,但性能较差,因为锁会导致线程阻塞。

二、ConcurrentX:高性能并发集合工具

什么是 ConcurrentX

ConcurrentX 是 Java 5 引入的一系列并发集合类,旨在提升并发操作时的性能,并且提供比传统锁更为细粒度的并发控制。通过不同的设计策略,避免了Collections.synchronizedX()的高性能开销。

常见的ConcurrentX集合类有:

Collections.synchronizedX() 与 ConcurrentX:到底该用谁?(避免死磕死锁)

  • ConcurrentHashMap
  • CopyOnWriteArrayList
  • BlockingQueue

工作原理:

  • ConcurrentX 中的集合类不直接使用synchronized关键字,而是通过 分段锁CAS操作无锁设计等技术实现更高效的并发控制。
  • ConcurrentHashMap 就是一个典型的例子,它使用了分段锁(Segment Lock)技术,将锁粒度从整个Map细化到每个段,因此可以支持更高效的并发操作。

ConcurrentHashMap 示例:

ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("A", 1);
map.put("B", 2);
System.out.println(map.get("A"));

关键点

  • ConcurrentX 提供了更细粒度的锁控制,能最大化支持高并发访问。
  • 通过精细的控制策略,能够避免Collections.synchronizedX()中的性能瓶颈,尤其在高并发场景下,性能表现更加优秀。

三、Collections.synchronizedX()ConcurrentX 的区别

特性 Collections.synchronizedX() ConcurrentX
线程安全性 通过synchronized加锁 通过细粒度锁、CAS等技术
性能 由于锁粒度较粗,性能较低 高并发时性能优秀(低锁竞争)
设计 基于传统锁机制,同步整个集合 基于无锁或分段锁机制,细化锁粒度
使用场景 适用于小规模并发操作,或者并发量较低时 适用于高并发、低延迟要求的场景
接口兼容性 ListSetMap兼容 提供了更多针对并发场景的集合类型,如BlockingQueueConcurrentMap
操作简便性 直接调用Collections.synchronizedX(),简单易用 需要选择对应的并发集合类,使用起来稍微复杂

四、什么时候使用 Collections.synchronizedX()?什么时候使用 ConcurrentX

1. Collections.synchronizedX() 的使用场景

  • 小规模并发场景:当系统中并发量不高,且对性能没有苛刻要求时,Collections.synchronizedX() 是一个简单的选择。它通过传统的加锁方式,保证了线程安全。
  • 兼容传统集合:如果你的代码需要使用常规的集合(如 ListSetMap),并且不想引入额外的并发集合类,可以使用 Collections.synchronizedX() 来包裹集合类,轻松实现线程安全。
  • 简单任务:如果只是偶尔对集合进行操作,Collections.synchronizedX() 也足够满足需求。

2. ConcurrentX 的使用场景

  • 高并发系统:当你面对高并发需求时,ConcurrentX 提供了更高效的并发控制。例如,ConcurrentHashMapCopyOnWriteArrayList 都是为高并发设计的,支持细粒度的锁和无锁操作,避免了性能瓶颈。
  • 性能敏感的应用:如果你的应用要求高吞吐量且对延迟敏感,ConcurrentX 提供了更好的选择。
  • 生产级系统:对于涉及高频次、长时间运行的系统(例如分布式缓存、在线电商),ConcurrentX 更加适合这些大规模并发场景。

五、代码示例:对比使用

Collections.synchronizedList 示例:

List<String> list = Collections.synchronizedList(new ArrayList<>());
list.add("Hello");
list.add("World");

synchronized (list) {
    // 遍历时需要手动加锁
    for (String item : list) {
        System.out.println(item);
    }
}

ConcurrentLinkedQueue 示例(高并发场景):

ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
queue.offer("Hello");
queue.offer("World");

for (String item : queue) {
    System.out.println(item);
}

六、总结:谁才是你“并发编程”的真命天子?

  • 如果你的应用在高并发环境下频繁访问集合,而性能又是首要考虑,那么你绝对应该选择 ConcurrentX 系列集合,例如 ConcurrentHashMapCopyOnWriteArrayList,它们的设计原则和技术保证了更高的并发吞吐量,尤其适用于大规模高并发的生产环境。

    Collections.synchronizedX() 与 ConcurrentX:到底该用谁?(避免死磕死锁)

  • 如果你的应用并发操作较少,且没有对性能的极致要求,或者只是想用简单的方式实现集合的线程安全,Collections.synchronizedX() 就能满足你的需求,但要记得,性能上没有 ConcurrentX 来得那么“霸气”!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

  • 随机文章
  • 热门文章
  • 热评文章
热门