【Java中的线程安全】

程序员接单群,单少但是质量好,欢迎大家加入,如二维码过期联系博主
在这里插入图片描述

Java中的线程安全

什么是线程安全?

当多个线程同时访问同一资源(如对象、方法或数据结构)时,若该资源能始终保持正确且可预测的行为,则称其为线程安全。具体表现为:

  • 数据一致性:共享数据不会被破坏或产生脏读
  • 操作原子性:关键操作不会被线程切换打断
  • 可见性:一个线程的修改对其他线程立即可见

例如非线程安全的 ArrayList 在并发写操作时可能抛出 ConcurrentModificationException,而线程安全的 CopyOnWriteArrayList 则能正确处理并发访问。

如何保证线程安全?

以下是常用技术方案(按实现原理分类):

  1. 互斥锁

    • 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();
          }
      }
      
  2. 无锁编程

    • 原子类
      基于 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;
          }
      }
      
  3. 线程封闭

    • ThreadLocal 变量
      每个线程持有独立副本:
      ThreadLocal<SimpleDateFormat> dateFormat = 
          ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));
      
  4. 线程安全容器

    • 同步包装类:Collections.synchronizedList(new ArrayList<>())
    • 并发容器:ConcurrentHashMap, CopyOnWriteArrayList
选择策略建议
场景推荐方案
简单计数器AtomicInteger
高频读低频写CopyOnWriteArrayList
复杂事务操作ReentrantLock + Condition
线程独享资源ThreadLocal
状态不可变对象不可变类设计

关键原则

  • 优先使用无锁方案(原子类/不可变对象)
  • 最小化同步范围(仅锁必要代码块)
  • 避免锁嵌套以防死锁
  • 对共享变量始终使用 volatile 保证可见性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值