条件队列

  1. 条件队列中的元素是一个个正在等待相关条件的线程
  2. 相关条件叫条件谓词

监视器:(Java的内置锁)


Java的内置锁也称为监视器锁或监视器。

进入和退出同步代码块的字节指令也称为monitorentermonitorexit

多线程工具包

Executor体系

显示锁Lock(CAS实现)

  1. CAS的全称为compare and swap。是一种CPU原子指令,通常有三个参数:内存地址、旧值、新值。轻量级的锁。

  2. 监视器借助内核互斥锁mutex实现,从用户态切换到内核态,量级较重。

显示条件队列Condition

  1. 各种类型的线程管理通过AQS来完成,全称为AbstractQueueSynchronizer。
  2. AQS是同步框架,它主要进行两个方面的工作:资源状态的管理和资源申请者的管理。
    具体对应为:一个volatile int state (代表共享资源) 和多个线程等待队列。

乐观锁与悲观锁:

  • 悲观锁:假设一定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。(适用于并发冲突频率高的场景)

    1
    如: 监视器借助mutex————内核级别的互斥锁。
  • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。(适用于冲突频率低的场景)

    1
    如: 显示锁使用CAS————CPU原语指令。

多线程常用类

  • ThreadLocal
  • volatile

    1. 将修改的值强制刷新到主存
    2. 通知其他相关线程变量已经失效
    3. 其它线程再使用变量时,会重新从主存读取
    4. 可见性和原子性
    5. 典型的应用场景(多线程中的标记位 DCL单例模式 简单的内存缓存)
  • ConcurrentHashMap

线程安全问题的本质:


多线程并发访问共享的可变变量,需要注意线程安全问题。

  1. 多线程
  2. 共享
  3. 可变

死锁的4个必要条件:

  1. 互斥访问
  2. 非抢占
  3. 持有并等待
  4. 循环等待

在Java编程中,有三种典型的死锁代码:

  1. 静态的锁顺序死锁

    1
    两个方法使用锁的顺序颠倒造成死锁
  2. 动态的锁顺序死锁

    1
    两个线程使用参数锁的顺序颠倒
  3. 协作对象之间发生的死锁

    1
    持有一个对象锁的情况下对另一个对象的方法调用

Java并发工具包
java.util.concurrent
java.util.concurrent.atomic
java.util.concurrent.locks

  • AtomicInteger: AtomicBoolean等原子变量
  • CountDownLatch(闭锁、门):在多线程执行过程中设置闭锁,只有当闭锁打开时,线程才能继续执行。
  • Semophore(信号量):控制同时访问某个资源或者进行某种操作的线程数量。
  • CyclicBarrier(栅栏):阻塞多个相关的线程,一直到某个时间发生。
  • Collections(工具类):创建并发容器,比如Collections.synchronizedList(new ArrayList())