投稿 资料上传 搜索
您现在的位置是: 首页 > 文章 > 正文

关于 wait、notify、notifyAll简单介绍

一:wait、notify、notifyAll简单介绍


    1. 为什么 wait、notify、notifyAll 不是线程对象Thread的方法 

       原因:首先应该明确wait、notify、notifyAll三个方法都是对锁对象的操作,而锁可以是任何对象。在java的世界中任何对象都属于Object类,因此这三个方法都是Object的方法, 而不是线程对象Thread的方法。

     2. 使用方法需要注意两点:
           a.  这三个方法必须在synchronized关键字包含的临界区(简单理解,就是代码块)内使用;

           b. 使用方式为锁对象.方法(),比如obj.wait();


     3. 什么时候加锁、什么时候释放锁?必须明确以下几点:

           a. notify和notifyAll方法不会释放锁,这两个方法只是通知其他使用该锁当锁但是在wait状态的线程,可以准备抢锁了(注:这里还要格外注意一点,其他使用该锁当锁且处于wait状态的线程只有被notify或notifyAll唤醒了,才有资格抢锁)


          b. 某个锁对象调用wait方法会立即释放当前线程的该对象锁 , 且其他线程通过

notify/notifyAll方法通知该线程可以抢该对象锁时,如果当前线程抢到了,会从当前锁的wait方法之后开始执行 — 即从哪里wait,从哪里执行;

          c. 在synchronized、wait、notify、notifyAll的组合里加锁的方式只有一个即进入同步代码块时加锁;


释放锁的方式有两个: ①锁对象调用wait方法时会释放锁 ;② 走完同步代码块时自动释放锁


    4. notify、notifyAll的区别
       a. 某个锁对象的notify只会唤醒一个使用该锁当锁且处于wait状态的线程;
       b. 某个锁对象的notifyAll方法会把所有使用该锁当锁且处于wait状态的线程都唤醒;
   使用建议: 为了防止某些线程无法被通知到,建议都使用notifyAll。

转载于:

文章标签:
阿里云服务器采购季
给作者打赏,鼓励TA抓紧创作!
评论