本文为本博主翻译,未经允许,严禁转载
简介
考虑一个场景,在运行时你必须确认一个Java线程是否持有特定对象的锁,例如,确认NewsReader线程是否持有NewsPaper对象的锁?如果这个问题出现在任何核心的Java面试中,那么我会自动假设可能有至少两个答案,一个是难以获得的原始答案,程序员想根据基本原理找出答案,而另一个可能是一些很少使用的Java API调用,顺便说一下,这实际上是在接受我最大的全球投资银行之一面试时是被问到的问题。投资银行领域,特别是现金股票, 需要强大的核心Java和多线程技能来构建高性能,低延迟的Java应用程序,以处理每天数百万个订单。
2种方法来查找线程是否持有Java对象的锁
在这里,我正在给出我的答案以及我在面试后发现的东西。是的,非常不幸,面试官在电话面试中询问我时,我不知道答案。我设法提供了基于同步块和wait()和notify()方法的属性的逻辑,如第一个答案所示,但他当时并不满意。
许多面试官期望得到他们认为最好的答案,他们会推动你继续寻找直到你放弃,或者你给他们他们想要的答案。这在面试中非常常见。
1)我想过,当wait()和notify()方法从非同步上下文中调用时会抛出IllegalMonitorStateException,所以我说我会调用newspaper.wait(),如果这个调用抛出异常,这意味着Java中的线程并未持有锁,否则线程持有锁。
2)后来我发现线程有一个名为holdsLock(Object obj)的静态方法,它根据线程是否对传递的对象持有锁来返回true或false。
您还可以学习Cay S. Horstmann的Core Java Volume 1 - Fundamentals或Java Threads 2nd Editon,以了解更多关于Java中的Thread类的内容。第一本书是以最容易的方式学习Java秘密的最佳书籍之一。
这就是如何找到一个线程是否拥有Java中某个特定对象的锁。如果您需要在Java应用程序中知道这一点,则应该使用java.lang.Thread类的holdsLock()方法。
意见,建议,创新更好的答案总是受欢迎的。
原文链接
How to check if a thread holds lock on a particular object in Java