zoukankan      html  css  js  c++  java
  • 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();
    }
    }
    }

  • 相关阅读:
    Java Sping 第一章——初识 Spring
    C++设计模式——状态模式 State
    线性代数思维导图(3)——向量组
    基于Servlet实现简单系统登录
    优秀博客汇总
    整理一些开源项目
    Android UI性能优化详解
    (原创)如何在spannableString中使用自定义字体
    (原创)用讯飞语音实现人机交互的功能
    (原创)speex与wav格式音频文件的互相转换(二)
  • 原文地址:https://www.cnblogs.com/rzkwz/p/12612532.html
Copyright © 2011-2022 走看看