Java线程安全的实现

1. 阻塞同步

使用锁实现,具体采用什么锁,有两种选择:

  • 内置锁也就是synchronized 关键字
  • JUC下具体锁的实现

2. 非阻塞同步

使用锁带来的问题

  • 频繁的线程阻塞、唤醒操作以及用户态,内核态的切换带来的性能问题。
  1. 可能这些额外的操作带来的时间消耗远大于线程自身业务执行时间
    所以引入非阻塞同步,也就是基于CAS操作。

  2. 最直接的实现就是JUC下的各种原子类的实现。

  • 虽然CAS避免了锁带来的性能开销,不过其仅适用于少部分同步场景
  • 没有阻塞同步更加具有普适性。
  1. 缺点
  • 未获取同步资源的线程陷入自旋状态,对于CPU的消耗很高
  • 仅能操作单个共享资源,对于组合类型还是需要加锁处理,或者重新组合为一个共享资源。
  • ABA问题。

3. 无同步方案

线程的本地存储,主要用于对于一个共享资源都尽可能的在同一个线程中执行,场景:

  • 譬如生产者-消费者模型中,消费者消费一个内容。
  • web服务中,一个请求对用于一个服务线程?(也属于生产者-消费者模型)
  • 链路跟踪中动态采集方法的执行信息。
posted @ 2025-05-17 16:47  kuki'  阅读(6)  评论(0)    收藏  举报