2 回答
TA贡献1797条经验 获得超6个赞
明显的非答案:错误的设计点。线程不“拥有”资源。
线程只是“执行线程”。他们运行你告诉他们运行的代码。因此,一个线程不拥有它来的任何对象。
因此,没有内置机制可以帮助满足您的要求。您必须自己实现一些东西,依赖于监控线程及其状态。这将是一项艰巨且具有挑战性的任务。主要是因为:多线程很难。
这里的严肃建议:从这个设计退后一步。而是考虑其他不同的方式来处理此类“资源”。
TA贡献1788条经验 获得超4个赞
这确实是一种错误的做法。显然,您可以像这样在 finally 块中锁定对象并解锁它:
private Lock lock = new ReentrantLock();
public void useObject() {
lock.lock();
try {
//do something with your resource.
}
finally {
lock.unlock();
}
}
这样,如果运行 useObject 的线程终止,它将执行 finally 块,并解锁保护资源的锁。
但是没有办法检测线程没有任何活动。如果线程被操作系统抢占,您将无从得知。那是在抽象层之下,你作为开发者,在操作。
如果您想更多地了解操作系统如何与线程一起工作,以及您不能做什么,您应该查看
Java 多线程、并发和性能优化
Udemy 上的课程。它还讨论了如何正确使用正确的锁来进行这种安全同步,并在您必须共享数据库连接等资源时从应用程序中获得最佳性能。
我希望它有帮助
添加回答
举报