Java并发编程学习笔记(三)线程的通知与等待

1、wait()函数当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起,直到发生下面几件事情之一才返回:其他线程调用了该共享对象的notify()或者notifyAll()方法;其他线程调用了该线程的interupt()方法,该线程抛出InteruptedException异常返回。另外需要注意的是,如果调用wait)方法的线程没有事先获取该对象的监视器锁,则调用w...
摘要由CSDN通过智能技术生成

1、wait()函数

当一个线程调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起,直到发生下面几件事情之一才返回:

  • 其他线程调用了该共享对象的notify()或者notifyAll()方法;
  • 其他线程调用了该线程的interupt()方法,该线程抛出InteruptedException异常返回。

另外需要注意的是,如果调用wait)方法的线程没有事先获取该对象的监视器锁,则调用wait()方法时调用线程会抛出illegalMonitorStateException异常。
那么一个线程如何才能获取一个共享变量的监视器锁呢?

  • 执行synchronized同步代码块时,使用该共享变量作为参数。

    synchronized(共享变量){
         
    //doSomething
    }
    
  • 调用该共享变量的方法,并且该方法使用了synchronized修饰。

    synchronized void add(int a,int b){
         
    //doSomething
    }
    

    另外需要注意的是,一个线程可以从挂起状态变为可以运行状态(也就是被唤醒),即使该线程没有被其他线程调用notify()、notifyAll()方法进行通知,或者被中断,或者等待超时,这就是所谓的虚假唤醒。

还需要注意的是,当前线程调用共享变量的wait)方法后只会释放当前共享变量上的锁,如果当前线程还持有其他共享变量的锁,则这些锁是不会被释放的。

package thread;

public class Wait01 {
   

    //创建共享资源
    private static volatile Object resourceA = new Object();
    private static volatile Object resourceB = new Object();

    public static void main(Strin
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值