你真的懂object.wait和 wait(long timeout)的区别吗

并发编程小知识 object.wait 和 object.wait(long timeout)

通常的理解

相同点:
都会在拥有锁的时候立即释放锁,线程会被系统挂起,失去cpu时间片,得不到调度。
不同点:
后者线程会在指定timeout的时间过去之后被唤醒

真的清楚了吗?

Q: 后者是在timeout的时间之后从wait立即返回吗
A: 答案是NO, timeout时间只是线程被阻塞的时间,过了这个时间,线程会被重新唤醒,并且去争夺锁。但并不意味着此时线程能从这个方法返回。如果线程没有获得锁依然会放在锁的等待队列里面。所以当前线程依然在这个方法里面等待获取锁,那么只有当从wait方法返回的时候,才是获得到了锁,当然这里没考虑线程被中断的情况。
所以线程被唤醒 != 线程得到锁。
在学些Java的并发框架是,理解这点尤其重要。如ReentrantLock的Condition,他的await和await(long timeout)语义上是和object的两个方法是一样的。最简单的理解就是当线程从这两个方法返回的时候,才是一定获得了锁。(这里不考虑中断)

public final void wait(long timeout, int nanos) throws interruptedexception 是JavaObject类的一个方法。它允许线程等待一段时间,并且可以指定纳秒的精度。 public final 表明这个方法是最终的,不能被子类重写或修改。 void 表明这个方法没有返回值。 wait(long timeout, int nanos) 是方法的名称,它接受两个参数:timeout(超时时间)nanos(纳秒数)。 throws interruptedexception 表示这个方法可能会抛出InterruptedException异常,该异常在线程在等待期间被中断时被抛出。 这个方法的作用是在当前对象上等待指定的时间。当调用这个方法时,当前线程会被阻塞,直到以下情况之一发生: - 其他线程调用了该对象上的notify()或notifyAll()方法; - 经过了指定的超时时间; - 当前线程被中断。 需要注意的是,这个方法必须在同步块或同步方法中调用。同步是通过synchronized关键字来实现的,它可以确保在同一时间只有一个线程可以访问一个对象。 如果等待时间过去,没有其他线程调用notify()或notifyAll()方法,并且没有中断发生,则当前线程会自动从等待状态中被唤醒继续执行。 如果在等待期间当前线程被中断,则会抛出InterruptedException异常,此时可以通过捕获该异常作相应的处理。 总结起来,public final void wait(long timeout, int nanos) throws interruptedexception 是一个线程同步的方法,允许线程等待一段时间,可以以纳秒为单位指定精度,并且可能抛出InterruptedException异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值