线程安全集合类

简介: 线程安全集合类

线程安全集合类概述

线程安全集合类可以分为三大类:

  1. 遗留的线程安全集合如 Hashtable , Vector
  2. 使用 Collections 装饰的线程安全集合,如:

Collections.synchronizedCollection

Collections.synchronizedList

Collections.synchronizedMap

Collections.synchronizedSet

Collections.synchronizedNavigableMap

Collections.synchronizedNavigableSet

Collections.synchronizedSortedMap

Collections.synchronizedSortedSet

  1. java.util.concurrent.*

重点介绍 java.util.concurrent.* 下的线程安全集合类,可以发现它们有规律,里面包含三类关键词:

Blocking、CopyOnWrite、Concurrent

  • Blocking 大部分实现基于锁,并提供用来阻塞的方法
  • CopyOnWrite 之类容器修改开销相对较重
  • Concurrent 类型的容器

  1. 内部很多操作使用 cas 优化,一般可以提供较高吞吐量
  2. 弱一致性


  1. 遍历时弱一致性,例如,当利用迭代器遍历时,如果容器发生修改,迭代器仍然可以继续进行遍历,这时内容是旧的
  2. 求大小弱一致性,size 操作未必是 100% 准确
  3. 读取弱一致性

注意:遍历时如果发生了修改,对于非安全容器来讲,使用 fail-fast 机制也就是让遍历立刻失败,抛出

ConcurrentModifificationException,不再继续遍历

ConcurrentHashMap类

主要特点

ConcurrentHashMap是Java集合框架中的一个类,它是一个线程安全的哈希表,可以在高并发的情况下进行读写操作,适合于多线程环境下的高效并发访问。

ConcurrentHashMap的主要特点如下:

  1. 线程安全性:ConcurrentHashMap是线程安全的,可以在多线程环境下并发访问,不需要像HashTable类那样使用同步方法或者加锁来保证线程安全。
  2. 分段锁设计:ConcurrentHashMap内部使用Segment数组来分段锁定。每个Segment就是一个独立的哈希表,拥有自己的锁。这样,在多线程的情况下,每个线程只需要锁住自己所需要访问的Segment,可以有效地提高并发访问性能。
  3. 高效性能:ConcurrentHashMap在多线程并发访问时,能够支持较高的吞吐量,而且可以通过控制Segment的数量,来平衡空间和时间的开销。当需要扩容的时候,只需要扩容其中的一个 Segment,而不需要对整个HashMap进行扩容。
  4. 支持高并发读写:ConcurrentHashMap支持高并发读写,可以在读写操作上分别使用不同的锁。这样,在读操作时,只需要获取读锁,其他读操作可以并行进行。在写操作时,需要获取写锁,此时不允许读和写操作同时进行。
  5. 数据一致性:ConcurrentHashMap虽然是线程安全的,但是在多线程的情况下,可能会存在一些数据不一致的情况。例如,两个线程同时对同一个键进行更新操作,这时候只有一个线程的更新操作会生效,而另一个线程的更新操作将会被忽略。所以,在使用ConcurrentHashMap类时,需要根据具体的需求来确定是否需要保证数据的一致性。

总的来说,ConcurrentHashMap是一个高效、线程安全、支持高并发访问的哈希表,适合于多线程环境下的高效并发访问。

主要方法

ConcurrentHashMap是Java中一个线程安全的哈希表实现,它支持高并发性能和线程安全,而这是通过使用分段锁的方式实现的。下面是ConcurrentHashMap类方法的总结:

  1. put(Object key, Object value)方法:将键值对存储到ConcurrentHashMap中,如果已存在则更新value值。
  2. putIfAbsent(Object key, Object value)方法:只有当key不存在时才将键值对存储到ConcurrentHashMap中,否则不做任何操作。
  3. remove(Object key)方法:从ConcurrentHashMap中移除指定的key-value,如果key不存在则不做任何操作。
  4. replace(Object key, Object oldValue, Object newValue)方法:如果键为key的键值对存在,且value等于oldValue,则将value更新为newValue。
  5. replace(Object key, Object value)方法:如果键为key的键值对存在,则将value更新为新的value。
  6. size()方法:返回ConcurrentHashMap中键值对的数量。
  7. clear()方法:清空ConcurrentHashMap中所有的键值对。
  8. containsKey(Object key)方法:如果ConcurrentHashMap中包含键为key的键值对,则返回true。
  9. containsValue(Object value)方法:如果ConcurrentHashMap中包含指定value的键值对,则返回true。
  10. get(Object key)方法:返回与指定键相关联的值。
  11. keySet()方法:返回ConcurrentHashMap中所有键的集合。
  12. values()方法:返回ConcurrentHashMap中所有值的集合。
  13. entrySet()方法:返回ConcurrentHashMap中所有键值对的集合。

总之,ConcurrentHashMap类提供了一系列线程安全的方法,支持高并发的读取和写入操作。它很适合在需要高并发读写操作,而且需要线程安全的场景下使用。

源码分析

https://www.nowcoder.com/discuss/460771795130466304?sourceSSR=search

https://developer.aliyun.com/article/342013

https://www.cnblogs.com/williamjie/p/9099861.html

https://www.nowcoder.com/discuss/409396995431940096?sourceSSR=search

八股笔记

https://blog.csdn.net/weixin_44936189/article/details/117091687

目录
相关文章
|
2天前
|
Java
【JavaEE】——多线程常用类
Callable的call方法,FutureTask类,ReentrantLock可重入锁和对比,Semaphore信号量(PV操作)CountDownLatch锁存器,
|
2天前
|
Java 程序员 调度
【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
创建线程的五种方式,Thread常见方法(守护进程.setDaemon() ,isAlive),start和run方法的区别,如何提前终止一个线程,标志位,isinterrupted,变量捕获
|
2天前
|
安全 Java API
【JavaEE】多线程编程引入——认识Thread类
Thread类,Thread中的run方法,在编程中怎么调度多线程
|
1月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
2月前
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
Lua的面向对象编程、协同线程与协同函数的概念和使用,以及Lua文件I/O操作的基本方法。
39 4
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
33 3
|
2月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
57 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
41 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
47 1
|
2月前
|
Java C++
【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch
【多线程】JUC的常见类,Callable接口,ReentranLock,Semaphore,CountDownLatch
38 0