Condition的使用和原理
Lock的通信方式:condition
Condition的使用
ConditionWait
public class ConditionWait implements Runnable{
private Lock lock;
private Condition condition;
public ConditionWait(Lock lock, Condition condition) {
this.lock = lock;
this.condition = condition;
}
@Override
public void run() {
try {
lock.lock(); //竞争锁
try {
System.out.println("begin - ConditionWait");
condition.await(); //阻塞
System.out.println("end - ConditionAwait");
} catch (InterruptedException e) {
e.printStackTrace();
}
}finally {
lock.unlock(); //释放锁
}
}
}
ConditionNotify
package com.exercise.exercise_0831;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class ConditionNotify implements Runnable {
private Lock lock;
private Condition condition;
public ConditionNotify(Lock lock, Condition condition) {
this.lock = lock;
this.condition = condition;
}
@Override
public void run() {
try {
lock.lock(); //竞争锁
System.out.println("begin - ConditionNotify");
condition.signal(); //唤醒阻塞状态的线程
// condition.signalAll(); //唤醒所有阻塞状态的线程
System.out.println("end - ConditionSignal");
} finally {
lock.unlock(); //释放锁
}
}
}
TEST
package com.exercise.exercise_0831;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class App {
public static void main(String[] args) {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
new Thread(new ConditionWait(lock, condition)).start();
new Thread(new ConditionNotify(lock, condition)).start();
}
}
整体流程分析如下:
总体流程: