• 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的进程

  • 相关阅读:
    python循环删除list中的元素
    Mysql主从同步原理简介
    python 3新式类的多继承
    面向对象之多态、多态性
    python的collections模块和functools模块
    Python(os和sys)使用
    javascript中的数据类型
    语法、关键保留字及变量
    使用JavaScript
    javascript的概述
  • 原文地址:https://www.cnblogs.com/yanze/p/10032363.html
Copyright © 2020-2023  润新知