各种相关的关键字、词

  • volatile:
    • 可见性
    • 禁止指令重排
  • CAS
  • ReentrantLock
  • ReadWriteLock
  • Synchronized
    • 偏向锁:一个线程X要持有锁A,如果锁A自上次被线程X释放后,没有被其他线程持有,则线程X可以直接进入该锁
    • 轻量级锁:在偏向锁的基础上,如果线程B也要持有锁A,此时对象头的线程id发生了变化,就会升级为轻量级锁,并且通过自旋的方式来获取轻量级锁。
    • 重量级锁:进入和退出锁时,需要OS在用户态和和心态之间切换
  • 乐观锁
  • 悲观锁
  • 公平锁
  • 非公平锁

分类:

  • Synchronized:偏向锁→轻量级锁→重量级锁
  • ReentrantLock:
    • 公平锁:ReentrantLock(true)
    • 非公平锁:ReentrantLock(false)
  • 乐观锁:CAS
  • 悲观锁:ReentrantLock、ReadWriteLock、Synchronized

多线程的三要素

  • 原子性:指的是一个或一系列操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
  • 可见性:指的是当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。
  • 有序性:指的是程序执行的顺序按照代码的先后顺序执行。

介绍:

Synchronized

对于Synchronized,一般默认为重量级锁,但是Java 1.6之后,为了减少获得锁和释放锁带来的性能消耗,引入了轻量级锁和偏向锁的概念
  • 递进关系:偏向锁->轻量级锁->重量级锁
  • 递进过程:属于JVM层面的锁优化,自动进行,无需开发者干预。

ReentrantLock

  • 一个可重入的互斥锁,功能比synchronized更强大
  • 提供了可轮询的锁请求、可定时的锁请求以及可中断的锁获取等高级功能。

    ReadWriteLock

    • 读写锁,允许多个线程同时读共享资源,但写操作是互斥的。
    • 主要实现类是ReentrantReadWriteLock,分为读锁和写锁。

    CAS(Compare-And-Swap)

    • 主要作用:实现同步和确保原子性的一种基础概念
    • 特性:当多个线程使用CAS操作一个变量是,只有一个线程会成功,并成功更新,其余会失败。
    • 优点:
      • CAS支持实现无锁和无等待的算法:与传统的基于锁的方法相比,减少了线程竞争和死锁问题的风险。
      • CAS可以通过避免获取和释放锁的开销,提供显著的性能优势。
    • CAS操作涉及三个操作数:
      • 内存值(V):内存位置当前的值。
      • 预期值(E):假定的内存位置的值,用于与当前值进行比较。
      • 新值(N):如果比较成功(即当前值与预期值匹配),需要写入内存位置的新值。
    • 工作方式:
      • 成功场景:如果内存中的值(V)等于预期值(E),CAS操作会用新值(N)更新内存位置。
      • 失败场景:如果内存中的值(V)与预期值(E)不匹配(表明自从上次读取以来该值已被另一个线程更新),CAS操作不会进行任何更新。

    参考/引用

    AOSP-源码下载编译JVM 基础知识