Java线程安全需分层选用机制:synchronized提供基础互斥;ReentrantLock支持显式控制与协作;并发集合如ConcurrentHashMap、CopyOnWriteArrayList优化集合访问;原子类如AtomicInteger实现无锁简单操作。

多个线程争抢资源,本质是缺乏同步控制导致的竞态条件。关键不是“怎么创建线程”,而是“如何让它们安全地访问共享资源”。Java 提供了多层机制,按场景复杂度和性能要求可分层选用。
用 synchronized 保证基础互斥
这是最直接的方式,适合临界区小、逻辑简单的场景。它通过对象监视器(monitor)强制同一时刻只有一个线程执行被保护的代码块或方法。
- 修饰实例方法:锁的是当前对象(this)
- 修饰静态方法:锁的是该类的 Class 对象
- 同步代码块更灵活:可指定任意对象作为锁,避免锁粒度过大
例如,对计数器递增操作加锁:
synchronized(this) { count++; }用 ReentrantLock 实现可控的显式锁
当需要尝试获取锁、设置超时、响应中断,或使用公平策略时,ReentrantLock 比 synchronized 更合适。
立即学习“Java免费学习笔记(深入)”;
- 必须在 finally 块中调用 unlock(),否则可能永久阻塞其他线程
- 支持 lockInterruptibly(),使等待中的线程能被中断
- 可配合 Condition 实现精准的线程协作(如生产者-消费者)
用并发集合替代手动同步
如果争抢的是集合类资源(如 Map、List、Queue),优先选用 java.util.concurrent 包中的线程安全实现。
- ConcurrentHashMap:分段锁或 CAS + 链表/红黑树,读操作无锁,写操作细粒度加锁
- CopyOnWriteArrayList:适合读多写少,写操作复制整个数组,读完全无锁
- BlockingQueue(如 LinkedBlockingQueue):天然支持线程间数据传递与阻塞控制
用原子类做无锁计数或状态更新
对简单变量(如计数器、开关标志),AtomicInteger、AtomicBoolean 等基于 CAS 的原子类性能更高,且避免死锁风险。
- count.incrementAndGet() 是线程安全的自增,底层由 CPU 指令保障原子性
- 比加锁轻量,但仅适用于单个变量的简单操作,不适用于跨多个变量的复合逻辑


















