首页 > 编程知识 正文

java多线程锁面试题,java 锁面试题

时间:2023-05-04 20:26:59 阅读:31551 作者:2175

等待() ) )

此方法用于使当前线程进入休眠状态,直到收到通知或中断。 wait ) )之前,线程必须获取对象的对象级锁定。 也就是说,只能在同步方法或同步块中调用wait ) )方法。 进入wait ()方法时,当前线程将解除锁定。 在从wait ()返回之前,线程将与其他线程冲突以重新获得锁定。 如果在没有相应的锁定的情况下调用wait (),则抛出RuntimeException的子类IllegalMonitorStateException。 因此,不需要try-catch结构。

通告() )

此方法也在同步方法或同步块中调用。 这意味着在调用线程之前,线程也必须获取该对象的对象级锁定。 的notify ) )调用时,如果没有相应的锁定,也会抛出IllegalMonitorStateException。

此方法用于通知可能等待对象锁定的其他线程。 如果有多个线程等待,则线程规划器会根据需要通知处于其中一个等待状态的线程,并等待获取对象的对象锁(通告后,当前线程不会立即释放对象锁)。 wait所在的线程无法立即获取对象锁。 在程序退出同步代码块之前,当前线程不会解锁。如果第一个获取对象锁的等待线程运行,对象锁将被解除。 此时,如果对象再次未使用notify语句,则即使该对象空闲,在其他等待状态下等待的线程也不会收到来自该对象的通知,直到该对象发出通告或通告全部这里需要注意的是,notify或notifyAll等待,而不是锁定。 这与以下notifyAll ) )方法执行后的情况不同。

通告全部() )

此方法的工作方式与notify ()方法相同,但有以下重要区别:

通告所有处于该对象的所有等待线程都退出等待状态(即,所有线程都已唤醒,不再等待通告或通告所有,但此时将存在对象锁) 等待获取对象锁,释放对象锁后,如果" notifyAll "线程终止并且调用notifyAll的任何线程获取了对象锁,则它将继续执行并同步

总结

线程调用对象的wait ) )方法时,线程位于该对象的等待池中,等待池中的线程不会与该对象的锁定冲突。

如果一个线程调用对象的notifyAll )方法(启动所有wait线程)或notify )方法(仅随机启动一个wait线程),则启动的线程是其on

高优先级线程很可能与对象锁冲突,如果线程不与对象锁冲突,它将保留在锁定池中,直到线程再次调用wait ) )方法时才返回等待池。 与对象锁定冲突的线程继续运行,直到同步代码块执行完成,然后释放对象锁定。 在这种情况下,锁定池中的线程将继续与对象锁定冲突。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。