轻松看懂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);
}

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

发布了78 篇原创文章 · 获赞 131 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/river66/article/details/90718182
今日推荐