gpt4 book ai didi

java - 在 Java 中,如何测试对象的监视器是否使用传统的低级锁定机制锁定?

转载 作者:行者123 更新时间:2023-11-30 06:37:50 36 4
gpt4 key购买 nike

在Java中,如何测试对象的监视器是否被锁定?换句话说,给定一个对象 obj,是否有任何线程拥有 obj 的监视器?

我不关心哪个线程拥有监视器。我需要测试的是是否有任何线程拥有给定对象的监视器。由于当前线程以外的线程可以拥有监视器,因此 Thread.holdsLock( obj ) 是不够的,因为它只检查当前线程。

我正在尝试找出最简单的解决方案。

这不是重复的,因为:

  1. 我无法使用更高级别/更新的并发/锁定机制。我不能使用Lock等,我必须使用低级/旧的/传统的货币/锁定机制,例如synchronized、wait()等。
  2. 我并不是想在监视器解锁时寻找执行代码的时间。我试图在监视器锁定时执行代码。事实上,为了提供一点背景知识,单元测试的这一部分我试图开始运行两个线程,它们都需要锁定同一个对象。
  3. 我无法调用内部私有(private) JVM 相关方法,例如 sun.* 。

因此,为了测试并发处理是否正确。我需要

  1. 创建两个线程。
  2. 启动线程 1 。
  3. 一旦线程 1 拥有监视器,就挂起线程 1。
  4. 启动线程 2 。
  5. 一旦线程 2 被线程 1 阻塞,就挂起线程 2 。
  6. 恢复线程 1。
  7. 加入话题 1。
  8. 运行一些断言。
  9. 恢复线程 2 。
  10. 加入线程 2。
  11. 运行一些断言。

我试图弄清楚的是执行 #3 的最佳方法,主要是确定线程 1 何时拥有监视器。

最佳答案

如果您确实想使用线程挂起来执行此操作,则可以让线程 1 在具有监视器时设置线程安全标志,并从测试线程观察该标志。

但是,我怀疑这是否是组合测试的最佳方式。如果您只想测试线程中的业务逻辑,则可以运行线程 1,加入它,运行第一组断言,然后运行线程 2,加入它,然后运行第二组断言。更好的是,您可以将业务逻辑放入 Runnables 中,并通过直接调用 run() 方法在测试线程中测试它们。

如果您试图解决线程同步问题,我的经验是,使用时间延迟是测试这些问题的更好方法,而不是直接与线程交互,因为直接与线程交互可能会引入或隐藏同步问题。有关更多信息,请参阅我对测试线程代码的一般问题的回答:

How should I unit test threaded code?

关于java - 在 Java 中,如何测试对象的监视器是否使用传统的低级锁定机制锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44914459/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com