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();
    }
    }
    }

  • 相关阅读:
    FastDfs
    git入门大全
    Dynamic Compilation and Loading of .NET Objects
    ASP.NET MVC 传递数据 从前台到后台,包括单个对象,多个对象,集合
    Windows系统不同磁盘间的扩容教程
    服务器Windows 2008 R2 安装SQL 2008 R2
    Windows实现内网IPMI端口转发
    FreeBSD 安装过程
    linux安装Zabbix监控
    Linux VPS实用简单安全配置
  • 原文地址:https://www.cnblogs.com/rzkwz/p/12612532.html
Copyright © 2011-2022 走看看