首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何安全和及时地使用Java处理稀缺的共享资源?

如何安全和及时地使用Java处理稀缺的共享资源?
EN

Stack Overflow用户
提问于 2014-05-17 18:40:34
回答 6查看 223关注 0票数 0

在并行应用程序中,线程组中的线程(32)使用共享的、非托管的和独立的一次性对象。

我们的c/c++应用程序中也有相同的东西,我使用shared_ptr<>来让对象在不需要对象之后进行处理和完成。

我只是尝试在Java中应用相同的东西,然后我面对了finalize()方法。但是也存在一些问题,因为GC有时太懒,对象甚至不能被识别为无法处理/完成的对象,有时被调用,但是没有保证GC允许对象完全调用finalize()

因此,我提出了另一个复杂的解决方案,我只是数数和跟踪线程使用的对象,但它也不工作,但我知道这不是一个可靠的解决方案,我知道我会面临意想不到的结果。

我只是想知道在java中是否存在类似于shared_ptr<>的东西,还是可以通过JNI来处理对象?

有什么想法吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-05-17 19:17:52

做您想做的事情需要付出一定的努力,而且在Java中永远不会觉得很自然,因为对资源的确定性清理对于Java来说是陌生的。不过,从Java 7开始,它已经变得更好了。

解决这一问题的最佳方法是:

  1. 在java包装器中添加一个java.util.concurrent.AtomicInteger类型的计数器,初始化为1(谢谢@Jules的支持,现在避免使用synchronized!)。
  2. 添加一个addRef方法,如果计数器为0,该方法将抛出返回this,以便更好地在try-statement中使用。
  3. 实现java.lang.AutoCloseable:当计数达到0时,close会减少计数,当计数达到0时释放资源。
  4. 添加终结器作为最终安全网:日志失败,以便更早地正确释放资源,并执行最终版本。
  5. 将注释添加到每个拥有这样一个引用且不是使用资源进行尝试的变量/参数中,因此您知道如何适当地调用addRefclose

使用java包装器的try-with-resources-block:

代码语言:javascript
运行
复制
try(resource.AddRef()) {
    // Do your thing
}
票数 5
EN

Stack Overflow用户

发布于 2014-05-17 19:09:10

在Java和 when an object is collected中没有强制“销毁”对象的通用方法(可能永远不会!)

人们通常需要担心的唯一资源是文件或流等外部资源--处理这种情况的一般方法--它通过close/AutoClosable使用手动生存期管理(如果使用终结器,则只使用“安全性”)。生存期完全留在调用方中,过早“关闭”资源(例如文件)将使其在其他地方无效。

这种手动管理可以通过获取/发布池来完成(当所有获取被释放时,“使用计数”变为零,并在基础资源上调用close );如果可以预先固定计数,则使用信号量进行更改。

另一方面,内部管理但不可访问的对象/资源将根据GC的需要被逐出,因此(通常)不需要担心它们的生命周期。

票数 2
EN

Stack Overflow用户

发布于 2014-05-17 19:11:24

您可以创建一个简单的manager对象,它知道如何创建和处理所述资源。在对象上实现同步的checkout()checkin()方法。签出方法在第一次调用时创建对象,增加引用计数,并返回对对象的引用。签入方法会减少引用计数,当它变为零时,它会处理该对象。然后,您只需使用try/finally模式(类似于锁/解锁)对对象的所有使用范围进行范围:

代码语言:javascript
运行
复制
Resource res = manager.checkout();
try {
  // ... work with resource here ...
} finally {
  manager.checkin(res);
}

注意,使用java 7 AutoCloseable可能会使它变得更干净一些。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23714853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档