多线程同步的手段有哪些?

1 个回答

  • 洛璃
    须知少日擎云志,曾许人间第一流。
    Java 里的多线程同步手段可以按**是否阻塞**、**使用层级**来分类,给你一个全面的总结。 ## 1. **关键字级同步**(语言内置) 1. **`synchronized`** * 修饰实例方法 → 锁对象实例(`this`) * 修饰静态方法 → 锁类的 `Class` 对象 * 修饰代码块 → 自定义锁对象 * 特点:可重入、阻塞式、JVM 级别实现,释放锁时会自动唤醒等待线程 2. **`volatile`** * 保证变量的**可见性**和**禁止指令重排**,但**不保证原子性** * 常配合 CAS 等机制实现轻量同步(无锁) ## 2. **`java.util.concurrent.locks` 显式锁** 1. **`ReentrantLock`** * 可重入、可中断、可限时、公平/非公平选择 * 需要手动 `lock()` / `unlock()` 2. **`ReentrantReadWriteLock`** * 读写分离:读锁共享、写锁独占 * 适合读多写少场景 3. **`StampedLock`**(JDK 8) * 乐观读锁、悲观读锁、写锁 * 乐观读无锁,适合读极多的场景 ## 3. **原子类(无锁同步,CAS 乐观锁)** 位于 `java.util.concurrent.atomic`,通过 **CAS + volatile** 实现原子性: * 基本类型:`AtomicInteger`、`AtomicLong` * 引用类型:`AtomicReference`、`AtomicStampedReference`(解决 ABA 问题) * 数组类型:`AtomicIntegerArray`、`AtomicLongArray` 优点:高并发、非阻塞,缺点是高冲突下自旋可能消耗 CPU ## 4. **线程间通信/协作工具类** 1. **`CountDownLatch`** * 倒计数归零前线程阻塞,可实现“一等多”或“多等一” 2. **`CyclicBarrier`** * 多线程相互等待,凑齐一定数量后同时继续 3. **`Semaphore`** * 控制并发访问的许可数量(限流) 4. **`Exchanger`** * 两个线程交换数据 ## 5. **并发容器(内部已同步)** * `ConcurrentHashMap`、`CopyOnWriteArrayList`、`BlockingQueue` 系列、`ConcurrentLinkedQueue`、`ConcurrentSkipListMap` 等 * 用分段锁、CAS 等机制保证线程安全 ## 6. **线程安全队列 / 生产者-消费者** * `BlockingQueue`(`ArrayBlockingQueue`、`LinkedBlockingQueue`) * `SynchronousQueue`(直接交付) * 内部用锁 + 条件变量控制并发访问 ## 7. **低层级同步(JUC 条件变量、LockSupport)** 1. **`Condition`**(配合 `Lock` 使用) * 类似 `wait()` / `notify()`,但可有多个条件队列 2. **`LockSupport.park()` / `unpark()`** * 线程阻塞与唤醒的底层工具,AQS 内部大量使用 ## 8. **乐观锁(版本号机制)** * 不直接加锁,通过比较版本号(或时间戳)来判断数据是否被修改 * 数据库、内存对象(CAS + 版本号)都能用 **总结表** | 类别 | 代表技术 | 特点 | | ----- | --------------------------------------------- | ------------ | | 关键字同步 | `synchronized`、`volatile` | 内置支持,易用但灵活性低 | | 显式锁 | `ReentrantLock`、`ReadWriteLock`、`StampedLock` | 高级功能,需手动释放 | | 原子类 | `AtomicInteger`、`AtomicReference` | 无锁,高并发性能好 | | 协作工具 | `CountDownLatch`、`Semaphore`、`CyclicBarrier` | 控制线程间协作 | | 并发容器 | `ConcurrentHashMap`、`BlockingQueue` | 内部已实现同步 | | 底层工具 | `Condition`、`LockSupport` | 精细化线程控制 |
    发布于 2025-08-13 10:23 •IP属地 黑龙江
    举报
    评论
    收藏