管程,JAVA同步的设计思想
管程:指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。
互斥:同一时刻只允许一个线程访问共享资源;
同步:线程之间如何通信、协作。
并发2大问题:同步 互斥
MESA模型
当多个线程同时试图进入管程内部时,只允许一个线程进入,其他线程则在入口等待队列中等待。
在线程执行过程中(已进入管程),条件变量A不符合要求,线程被阻塞时会进入条件变量等待队列。
AQS
AbstractQueuedSynchronizer(简称 AQS),AQS是一个抽象同步框架,可以用来实现一个依赖状态的同步器。
JDK中的大部分同步器都是基于AQS实现的
AQS具备的特性:
- 阻塞等待队列
- 共享/独占
- 公平/非公平
- 可重入
- 允许中断
AQS定义两种队列
同步等待队列: 主要用于维护获取锁失败时入队的线程。
条件等待队列: 调用await()的时候会释放锁,然后线程会加入到条件队列,调用signal()唤醒的时候会把条件队
列中的线程节点移动到同步队列中,等待再次获得锁。
AQS 定义了5个队列中节点状态:
- 值为0,初始化状态,表示当前节点在sync队列中,等待着获取锁。
- CANCELLED,值为1,表示当前的线程被取消;
- SIGNAL,值为-1,表示当前节点的后继节点包含的线程需要运行,也就是unpark;
- CONDITION,值为-2,表示当前节点在等待condition,也就是在condition队列中;
- PROPAGATE,值为-3,表示当前场景下后续的acquireShared能够得以执行;