gpt4 book ai didi

java - 如何安全、及时地处置Java中稀缺的共享资源?

转载 作者:行者123 更新时间:2023-12-01 06:38:34 24 4
gpt4 key购买 nike

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

我们的 c/c++ 应用程序中有同样的东西,我使用 shared_ptr<>为了让对象在不需要该对象后立即释放并完成。

我只是尝试在 Java 中应用同样的东西,然后我遇到了 finalize()方法。但也有一些问题,因为GC有时太懒了,对象甚至没有被识别为无法访问的对象来进行处置/终结,有时它被调用,但不保证GC让对象调用finalize()完全。

所以我刚刚提出了另一个复杂的解决方案,我只是倒计时并跟踪线程正在使用它也不起作用的对象,但我知道这不是一个可靠的解决方案,而且我知道我将面临意外的情况结果。

我只是想知道是否有相当于 shared_ptr<> 的东西在java中,或者是否可以通过JNI处理对象?

有什么想法吗?

最佳答案

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

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

  1. java.util.concurrent.AtomicInteger 类型的计数器添加到您的 java 包装器,初始化为 1(感谢 @Jules 为此,现在避免 synchronized!) .
  2. 添加一个 addRef 方法,该方法在计数器为 0 时抛出异常,返回 this 以便更好地在 try 语句中使用。<
  3. 实现java.lang.AutoCloseable:close当计数不为0时减少计数,当计数达到0时释放资源。
  4. 添加终结器作为最终安全网:记录未能尽早正确释放资源的故障,并进行最终释放。
  5. 为拥有此类引用且不是 try-with-resource 的每个变量/参数添加注释,以便您知道根据需要调用 addRefclose .

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

try(resource.AddRef()) {
// Do your thing
}

关于java - 如何安全、及时地处置Java中稀缺的共享资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23714853/

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