zoukankan      html  css  js  c++  java
  • wait() 与 notify/notifyAll()

    wait() 与 notify/notifyAll() 是Object类的方法

    1. wait() 与notify/notifyAll方法必须在同步代码块中使用

    在执行以上方法时,要先获得锁。那么怎么获得锁呢?

    使用synchronized关键字获得锁。因此,wait() 与  notify/notifyAll() 经常与synchronized搭配使用,

    在synchronized修饰的同步代码块或方法里面调用wait() 与  notify/notifyAll()方法

    2. wait() 与  notify/notifyAll() 的执行过程

    前提:锁只有一把,只是一个对象

    当线程执行lock.wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。

    当执行notify/notifyAll方法时,会唤醒一个/所有处于等待该对象锁的线程

    package cn.bit13.libra.testWaitNotify;
    
    public class ThreadA extends Thread{
        private Object lock;
        public ThreadA(Object lock){
            super();
            this.lock= lock;
        }
    
        @Override
        public void run(){
            synchronized (lock){
                try {
                    System.out.println("A放弃锁");
                    lock.wait();
                }catch(InterruptedException e){
    
                }
                System.out.println("A重获锁");
            }
        }
    }
    package cn.bit13.libra.testWaitNotify;
    
    public class ThreadB extends Thread{
        private Object lock;
        public ThreadB(Object lock){
            super();
            this.lock= lock;
        }
    
        @Override
        public void run(){
          synchronized (lock){
              System.out.println("B通知A可以重获锁(但必须等B执行完)");
               lock.notify();
               System.out.println("B运行完");
            }
        }
    }
    package cn.bit13.libra.testWaitNotify;
    
    public class TestWaitNotify {
        public static void main(String[] args){
            Object lock= new Object(); //锁即一个对象
            Thread a= new ThreadA(lock);
            a.start();
            Thread b= new ThreadB(lock);
            b.start();
        }
    }

    输出:

    A放弃锁
    B通知A可以重获锁(但必须等B执行完)
    B运行完
    A重获锁

    3. notify()通知第一个wait的进程,notifyAll()通知所有wait的进程

  • 相关阅读:
    HDU--2024
    HDU--2021
    HDU--2020
    HDU--2019
    HDU--2018
    HDU--2017
    HDU--2016
    python全栈开发day13-迭代器、生成器、列表推导式等
    python全栈开发day12-函数的有用信息、带参数的装饰器、多个装饰器装饰一个函数、global和nonlocal的进一步解析和总结
    Python3使用Print输出带颜色字体
  • 原文地址:https://www.cnblogs.com/yanze/p/10032363.html
Copyright © 2011-2022 走看看