• 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
Copyright © 2020-2023  润新知