经典Java面试题:怎么检测一个线程是否拥有锁?

2022年7月6日 22点热度 0人点赞
在 java.lang.Thread 中有一个方法叫 holdsLock(),它返回 true 如果当且仅当当前线程拥有某个具体对象的锁。

 

 

工具/原料

  • Thread
  • holdsLock

方法/步骤

  1. 1

    产生死锁的四个必要条件:

    互斥条件:一个资源每次只能被一个进程(线程)使用。

     

    请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放。

     

    不剥夺条件 : 此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。

     

    循环等待条件 : 多个进程(线程)之间形成一种头尾相接的循环等待资源关系。

  2. 2

    设法提供了基于同步块和wait()和notify()方法的属性的逻辑,如第一个答案所示,但他当时并不满意许多面试官期望得到他们认为最好的答案,他们会推动你继续寻找直到你放弃,或者你给他们他们想要的答案。

     

  3. 3

    当wait()和notify()方法从非同步上下文中调用时会抛出IllegalMonitorStateException,所以我说我会调用newspaper.wait(),如果这个调用抛出异常,这意味着Java中的线程并未持有锁,否则线程持有锁。

  4. 4

    后来我发现线程有一个名为holdsLock(Object obj)的静态方法,它根据线程是否对传递的对象持有锁来返回true或false。

     

     

  5. 5

    Cay S. Horstmann的Core Java Volume 1  -  Fundamentals或Java Threads
    2nd Editon,以了解更多关于Java中的Thread类的内容。

  6. 6

    这就是如何找到一个线程是否拥有Java中某个特定对象的锁。如果您需要在Java应用程序中知道这一点,则应该使用java.lang.Thread类的holdsLock()方法。

    END
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部

laozhao

这个人很懒,什么都没留下

文章评论