sleep()和wait()方法

sleep()和wait()方法与对象锁、锁池、等待池

近几天看线程的时候遇到一道题:

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

  • A sleep是线程类(Thread)的方法,wait是Object类的方法;
  • B sleep不释放对象锁,wait放弃对象锁
  • C sleep暂停线程、但监控状态仍然保持,结束后会自动恢复
  • D wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态

也就顺便来谈谈自己对于sleep和wait方法的理解

1.关于对象锁:

这个对象指的是拥有synchronized修饰的函数,或者是代码块的一个类的实例

2.关于锁池和等待池:

首先,我们知道,java对象有两个池,锁池和等待池
我的理解

当调用了wait()方法,释放锁资源和Cpu资源,线程进入等待池,当其他线程调用notify()会从等待池任意选择一个线程调入锁池,notifyAll()会调用所有等待池线程进入锁池,锁池里的对象可以竞争锁,优先级高的获得锁的能力更强,获得锁的线程可以进入就绪态继续执行,执行完之后释放锁,然后锁池里的线程再继续竞争。

3.关于wait() ,notifyAll(),notify() 三个方法:

(1)wait()

public final void wait() throws
InterruptedException,IllegalMonitorStateException
该方法用来将当前线程置入休眠状态,直到接到通知或被中断为止。在调用wait()之前,线程必须要获得该对象的对象级别锁,即只能在同步方法或同步块中调用 wait()方法。进入wait()方法后,当前线程释放锁。在从 wait()返回前,线程与其他线程竞争重新获得锁。

(2)notify()

public final native void notify() throws IllegalMonitorStateException
该方法也要在同步方法或同步块中调用,即在调用前,线程也必须要获得该对象的对象级别锁,的如果调用 notify()时没有持有适当的锁,也会抛出IllegalMonitorStateException。

该方法用来通知那些可能等待该对象的对象锁的其他线程。如果有多个线程等待,则线程规划器任意挑选出其中一个wait()状态的线程来发出通知,并使它等待获取该对象的对象锁(notify 后,当前线程不会马上释放该对象锁,wait所在的线程并不能马上获取该对象锁,要等到程序退synchronized 代码块后,当前线程才会释放锁,wait所在的线程也才可以获取该对象锁),但不惊动其他同样在等待被该对象notify的线程们。当第一个获得了该对象锁的wait 线程运行完毕以后,它会释放掉该对象锁,此时如果该对象没有再次使用 notify 语句,则即便该对象已经空闲,其他 wait状态等待的线程由于没有得到该对象的通知,会继续阻塞在 wait 状态,直到这个对象发出一个 notify 或 notifyAll。这里需要注意:它们等待的是被 notify 或 notifyAll,而不是锁。这与下面的notifyAll()方法执行后的情况不同。

(3)notifyAll()

public final native void notifyAll() throws
IllegalMonitorStateException 该方法与 notify ()方法的工作方式相同,重要的一点差异是:notifyAll 使所有原来在该对象上 wait 的线程统统退出 wait 的状态(即全部被唤醒,不再等待 notify 或notifyAll,但由于此时还没有获取到该对象锁,因此还不能继续往下执行),变成等待获取该对象上的锁,一旦该对象锁被释放(notifyAll线程退出调用了 notifyAll 的 synchronized代码块的时候),他们就会去竞争。如果其中一个线程获得了该对象锁,它就会继续往下执行,在它退出 synchronized代码块,释放锁后,其他的已经被唤醒的线程将会继续竞争获取该锁,一直进行下去,直到所有被唤醒的线程都执行完毕。

所以根据以上信息,此题选D

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值