一题带你彻底理解 sleep() 和 wait()

  • 时间:
  • 浏览:2
  • 来源:5分快乐8APP下载_5分快乐8APP官方

当有程序调用了对象的 notifyAll()办法 (唤醒所有 wait 程序)或 notify()办法 (只随机唤醒有1个 wait 程序),被唤醒的的程序便会进入该对象的锁池中,锁池中的程序会去竞争该对象锁。

关于sleep()和wait(),以下描述错误的一项是:

锁池 :假设程序A可能拥有了某个对象(注意:全部有的是类)的锁,而其它的程序想要调用这名对象的某个synchronized办法 (可能synchronized块),可能哪此程序在进入对象的synchronized办法 时候需要先获得该对象的锁的拥有权,而且 该对象的锁目前正被程序A拥有,或多或少或多或少哪此程序就进入了该对象的锁池中。

可能程序调用了对象的 wait()办法 ,这么 程序便会处于该对象的等待的图片 池中,等待的图片 池中的程序我不要 去竞争该对象的锁。

最现在现在开始的那道题答案是D

wait()

public final native void notify() throws IllegalMonitorStateException

注:wait() ,notifyAll(),notify() 有1个办法 全部有的是Object类中的办法 .

在往下的文章中,我我不要 理解为有1个对象有且都还后能 要能 一把锁,锁在不同程序间传递,有1个程序都还后能 多次获得同有1个对象的锁。我不要 不考虑有1个对象上多个锁这名办法 是全部有的是我我真是处于,这对下面影响不大。

A sleep是程序类(Thread)的办法 ,wait是Object类的办法 ;

深入理解:

notifyAll()

优先级高的程序竞争到对象锁的概率大,而且某程序这么 竞争到该对象锁,它有的是留在锁池中,唯有程序再次调用 wait()办法 ,它才会重新回到等待的图片 池中。而竞争到对象锁的程序则继续往下执行,直到执行完了 synchronized 代码块,它会释放掉该对象锁,这时锁池中的程序会继续竞争该对象锁。

在Java中,每个对象全部有的是有1个池,锁(monitor)池和等待的图片 池

所有对象都自动蕴藏单一的锁。

JVM负责跟踪对象被加锁的次数。可能有1个对象被解锁,其计数变为0。在任务(程序)第一次给对象加锁的时候,计数变为1。每当这名相同的任务(程序)在此对象上获得锁时,计数会递增。 都还后能 要能 首先获得锁的任务(程序)要能继续获取该对象上的多个锁。 每当任务离开有1个synchronized(同步)办法 ,计数递减,当计数为0的时候,锁被全部释放,此时别的任务就都还后能 使用此资源。

D wait后进入等待的图片 锁定池,都还后能 要能 针对此对象发出notify办法 后获得对象锁进入运行状况

截取网上的一句话:

原文发布时间为: 2018-11-16

本文作者: Java技术驿站

本文来自云栖社区公司战略合作 伙伴“ Java技术驿站”,了解相关信息都还后能 关注“ Java技术驿站”。

该办法 用来将当前程序置入休眠状况,直到接到通知或被中断为止。在调用 wait()时候,程序需要要获得该对象的对象级别锁,即都还后能 要能 在同步办法 或同步块中调用 wait()办法 。进入 wait()办法 后,当前程序释放锁。在从 wait()返回前,程序与或多或少程序竞争重新获得锁。可能调用 wait()时,这么 持有适当的锁,则抛出 IllegalMonitorStateException,它是 RuntimeException 的有1个子类,而且 ,需要 try-catch 社会形态。

该办法 用来通知哪此可能等待的图片 该对象的对象锁的或多或少程序。可能有多个程序等待的图片 ,则程序规划器任意取舍出其蕴藏1个 wait()状况的程序来发出通知,并使它等待的图片 获取该对象的对象锁(notify 后,当前程序我不要 马上释放该对象锁,wait 所在的程序我不要 能马上获取该对象锁,要等到程序退出 synchronized 代码块后,当前程序才会释放锁,wait所在的程序也才都还后能 获取该对象锁),但不惊动或多或少同样等待的图片 的图片 被该对象notify的程序们。当第有1个获得了该对象锁的 wait 程序完毕时候,它会释放掉该对象锁,此时可能该对象这么 再次使用 notify 一句话,则即便该对象可能空闲,或多或少 wait 状况等待的图片 的程序可能这么 得到该对象的通知,会继续阻塞在 wait 状况,直到这名对象发出有1个 notify 或 notifyAll。这里需要注意:它们等待的图片 的是被 notify 或 notifyAll,而全部有的是锁。这与下面的 notifyAll()办法 执行后的状况不同。

该办法 与 notify ()办法 的工作办法 相同,重要的或多或少差异是:

这段话令人感到迷惑,有1个对象全部有的是都还后能 要能 有1个锁吗?都还后能 要能 获得这名对象的锁要能对它进行操作,若这名对象的锁被有1个程序先获得,那就或多或少程序就需要等待的图片 。那多次加锁哪此意思,锁全部有的是依附于对象的吗?

该办法 也要在同步办法 或同步块中调用,即在调用前,程序也需要要获得该对象的对象级别锁,的可能调用 notify()时这么 持有适当的锁,也会抛出 IllegalMonitorStateException。

一道Java的题目:

C sleep暂停程序、但监控状况仍然保持,现在现在开始有的是自动恢复

public final native void notifyAll() throws IllegalMonitorStateException

notify()

B sleep不释放对象锁,wait放弃对象锁

notifyAll 使所有时候在该对象上 wait 的程序或多或少或多或少或多或少或多或少退出 wait 的状况(即全部被唤醒,不再等待的图片 notify 或 notifyAll,但可能此时还这么 获取到该对象锁,而且 还都还后能 继续往下执行),变成等待的图片 获取该对象上的锁,一旦该对象锁被释放(notifyAll 程序退出调用了 notifyAll 的 synchronized 代码块的时候),大伙就会去竞争。可能其蕴藏1个程序获得了该对象锁,它就会继续往下执行,在它退出 synchronized 代码块,释放锁后,或多或少的可能被唤醒的程序可能继续竞争获取该锁,老是 进行下去,直到所有被唤醒的程序都执行完毕。

等待的图片 池 :假设有1个程序A调用了某个对象的wait()办法 ,程序A就会释放该对象的锁(可能wait()办法 需要再次出现在synchronized中,时候自然在执行wait()办法 时候程序A就可能拥有了该对象的锁),同时程序A就进入到了该对象的等待的图片 池中。可能另外的有1个程序调用了相同对象的notifyAll()办法 ,这么 处于该对象的等待的图片 池中的程序就会全部进入该对象的锁池中,准备争夺锁的拥有权。可能另外的有1个程序调用了相同对象的notify()办法 ,这么 仅仅有有1个处于该对象的等待的图片 池中的程序(随机)会进入该对象的锁池.

public final void wait() throws InterruptedException,IllegalMonitorStateException