轻松看懂synchronized和wait()、notify()、notifyAll()的关系

synchronized:同步的意思,可以分为对象同步、类同步。

wait()、notify()、notifyAll():等待与唤醒;等待的是锁,唤醒的是线程,目的是为了实现数据的同步。

类同步:public static synchronized void method(){...}或者synchronized(类名){...},其中{}里面的代码块拥有类锁

对象同步:public synchronized void method(){...}或者synchronized(对象名或者this){...},其中{}里面的代码块拥有对象锁

数据:拥有类锁的代码块可以修改类的静态成员数据,其他地方则不可以修改;拥有对象锁的代码块可以修改对象的成员数据,其他地方则不可以修改。

只有一个锁:synchronized可以在多个地方使用,但是同一时刻只能有一个地方可以拥有锁,拥有锁的地方才可以操作数据

wait()做了什么事:把锁释放了!代码执行到这一行不再往下执行,一直处于等待中,直到重新拥有锁后才会往下执行或者线程被中断(会抛出InterruptedException)。

notify()做了什么事:唤醒一个线程(这个线程是调用了wait()处于等待状态的线程),并让这个线程准备好获取锁并往下执行。

notifyAll()做了什么事:唤醒所有线程(这些线程是调用了wait()处于等待状态的线程),并让这些线程准备好竞争锁并往下执行。

notify()、notifyAll()并不会释放锁:需要等到notify()、notifyAll()所在的synchronized修饰的代码块执行完才会释放锁。

调用wait()、notify()和notifyAll()的前提条件是什么:拥有锁(必须是被synchronized修饰过的才会拥有锁)!如果代码块中在没有拥有锁的情况下,调用了这三个方法,会抛出IllegalMonitorStateException。

关系:调用wait()、notify()和notifyAll()的代码块必须是被synchronized修饰过的。

如何使用wait()方法:java官方文档给出的实现方案如下

synchronized (obj) {
       while (条件不满足时){
            obj.wait();
       }
       doSomething(obj);
}

如果对您有用的话赞一下呗!谢谢!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值