lock的Condition 同步监视器,顺序调用例子

   
Lock取代 synchronized的使用方法和语句, Condition取代了使用对象的监控方法。

   Lock lock = new ReentrantLock();//公平锁 Condition condition = lock.newCondition(); // condition.await(); //等待唤醒 // condition.signalAll();//唤醒全部
  void signal()一个等待线程醒来。如果线程正在等待这种情况然后醒来的一个选择。该线程从await回来之前必须重新获得锁。

   
Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); // condition.await(); //等待唤醒 // condition.signalAll();//唤醒全部   通用格式 public void increment() throws InterruptedException { //加锁 lock.lock(); try { //通知其他线程 condition.signalAll(); } finally { //关锁 lock.unlock(); } }

  -------------------------------------------------

顺序调用
public class C {
public static void main(String[] args) {

Date3 date = new Date3();
new Thread(()->{
for (int i = 0; i < 10; i++) {
date.printA();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
date.printB();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 10; i++) {
date.printC();
}
},"C").start();
}
}
class Date3{//资源类 Lock

private Lock lock = new ReentrantLock();
//一个监视器监视一个方法
Condition condition1 = lock.newCondition();
//一个监视器监视一个方法
Condition condition2 = lock.newCondition();
//一个监视器监视一个方法
Condition condition3 = lock.newCondition();
private int number = 1;
public void printA(){
lock.lock();

try {
//写业务代码
//业务->判断->执行->通知
//如果number!=1就不仅进入方法,执行number=2,唤醒condition2
while (number!=1){
//等待
condition1.await();
}
System.out.println(Thread.currentThread().getName()+"->A");
number=2;
condition2.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printB(){
lock.lock();

try {
//写业务代码
//业务->判断->执行->通知
//如果number!=2就不进入方法,执行number=3,唤醒condition3
while (number!=2){
condition2.await();
}
System.out.println(Thread.currentThread().getName()+"->B");
//唤醒指定的人
number=3;
condition3.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void printC(){
lock.lock();

try {
//写业务代码
//业务->判断->执行->通知
//如果number!=3就不进入方法,执行number=1,唤醒condition1
while (number!=3){
condition3.await();
}
System.out.println(Thread.currentThread().getName()+"->C");
number=1;
condition1.signal();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}

原文地址:https://www.cnblogs.com/rzkwz/p/12612532.html