程序员接单群,单少但是质量好,欢迎大家加入,如二维码过期联系博主

Java中的线程安全
什么是线程安全?
当多个线程同时访问同一资源(如对象、方法或数据结构)时,若该资源能始终保持正确且可预测的行为,则称其为线程安全。具体表现为:
- 数据一致性:共享数据不会被破坏或产生脏读
- 操作原子性:关键操作不会被线程切换打断
- 可见性:一个线程的修改对其他线程立即可见
例如非线程安全的 ArrayList 在并发写操作时可能抛出 ConcurrentModificationException,而线程安全的 CopyOnWriteArrayList 则能正确处理并发访问。
如何保证线程安全?
以下是常用技术方案(按实现原理分类):
-
互斥锁
synchronized关键字
通过对象锁保证代码块/方法的原子性:public class Counter { private int count = 0; // 同步方法 public synchronized void increment() { count++; } // 同步代码块 public void decrement() { synchronized(this) { count--; } } }- 显式锁
提供更灵活的锁控制:private final ReentrantLock lock = new ReentrantLock(); public void safeMethod() { lock.lock(); try { // 临界区代码 } finally { lock.unlock(); } }
-
无锁编程
- 原子类
基于 CAS实现:AtomicInteger atomicInt = new AtomicInteger(0); atomicInt.incrementAndGet(); // 线程安全的原子操作 - 不可变对象
状态不可修改的对象天然线程安全:public final class ImmutablePoint { private final int x; private final int y; // final 保证构造后不可变 public ImmutablePoint(int x, int y) { this.x = x; this.y = y; } }
- 原子类
-
线程封闭
ThreadLocal变量
每个线程持有独立副本:ThreadLocal<SimpleDateFormat> dateFormat = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
-
线程安全容器
- 同步包装类:
Collections.synchronizedList(new ArrayList<>()) - 并发容器:
ConcurrentHashMap,CopyOnWriteArrayList等
- 同步包装类:
选择策略建议
| 场景 | 推荐方案 |
|---|---|
| 简单计数器 | AtomicInteger |
| 高频读低频写 | CopyOnWriteArrayList |
| 复杂事务操作 | ReentrantLock + Condition |
| 线程独享资源 | ThreadLocal |
| 状态不可变对象 | 不可变类设计 |
关键原则:
- 优先使用无锁方案(原子类/不可变对象)
- 最小化同步范围(仅锁必要代码块)
- 避免锁嵌套以防死锁
- 对共享变量始终使用
volatile保证可见性

被折叠的 条评论
为什么被折叠?



