JUC中的Condition类的阻塞与唤醒执行原理
直接看源码还是有些不太容易的,毕竟里面包含ASQ 与 线程阻塞唤醒机制。
以下 是个人阅读源码时整理的一个关于Condition的阻塞与唤醒机制的图示说明,大家可以参考,希望帮助到大家。
processon 原图地址:
https://www.processon.com/diagraming/5fa8ddb2637689653d8ed087
演示代码:
package com.example.demo;
import com.fasterxml.jackson.datatype.jsr310.deser.key.LocalDateKeyDeserializer;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestDmoe {
public static void main(String[] args) {
final Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("threadA =========START=======await>");
lock.lock();
condition.await();
System.out.println("threadA =========END========await>");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}, "threadA");
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println("threadB =========START========signal>");
lock.lock();
condition.signal();
System.out.println("threadB =========END========signal>");
} finally {
lock.unlock();
}
}
}, "threadB");
threadA.start();
threadB.start();
}
}
执行效果:
图解原理:
绿色为步骤一
红色为步骤二
上面是全局视角展示的执行逻辑,下面举例几个核心代码细节进行分析
源码细节分析: