线程安全的类有哪些?平时有使用吗?用来解决什么问题?

57 阅读2分钟

一、常见的线程安全类

Java 中典型的线程安全类主要集中在 java.util.concurrent 包及基础类库中,核心包括:

  • 并发集合类:ConcurrentHashMap、CopyOnWriteArrayList、CopyOnWriteArraySet、BlockingQueue(如 ArrayBlockingQueue、LinkedBlockingQueue)

  • 原子操作类:AtomicInteger、AtomicLong、AtomicBoolean、AtomicReference(位于 java.util.concurrent.atomic 包)

  • 锁与同步工具类:ReentrantLock、CountDownLatch、CyclicBarrier、Semaphore

  • 基础类型包装类:String(不可变特性天然线程安全)、Integer/Long 等(缓存值范围内的对象复用,且无修改方法)

二、是否常用及解决的问题

日常开发中频繁使用,核心用于解决多线程并发访问共享资源时的线程安全问题,具体场景如下:

1.解决“数据不一致”问题

例如用 AtomicInteger 替代普通 int 作为计数器:多线程同时执行 count++ 时,普通 int 会因“读取-修改-写入”非原子操作导致计数不准,而 AtomicInteger 通过 CAS 机制保证操作原子性,确保计数正确。

2.解决“集合并发修改异常”问题

例如用 CopyOnWriteArrayList 替代 ArrayList:多线程同时遍历和修改 ArrayList 会抛出 ConcurrentModificationException,而 CopyOnWriteArrayList 通过“写时复制”机制,读写分离,避免并发修改异常,适合读多写少场景。

3.解决“线程同步与协作”问题

例如用 CountDownLatch 实现“主线程等待所有子线程完成”:启动多个子线程执行任务后,主线程调用 latch.await() 阻塞,直到所有子线程执行 latch.countDown() 使计数器归 0,主线程才继续执行,避免主线程提前结束导致任务未完成。

4.解决“高并发下的高效锁竞争”问题

例如用 ConcurrentHashMap 替代 Hashtable/synchronized Map:Hashtable 全表加锁,并发度低;ConcurrentHashMap(JDK 1.8 后)通过“ CAS + 同步块”实现分段锁,仅锁定冲突的桶,大幅提升高并发下的读写效率。