作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在并行应用程序中,线程组中的线程 (32) 使用共享的非托管且独立的一次性对象。
我们的 c/c++ 应用程序中有同样的东西,我使用 shared_ptr<>
为了让对象在不需要该对象后立即释放并完成。
我只是尝试在 Java 中应用同样的东西,然后我遇到了 finalize()
方法。但也有一些问题,因为GC有时太懒了,对象甚至没有被识别为无法访问的对象来进行处置/终结,有时它被调用,但不保证GC让对象调用finalize()
完全。
所以我刚刚提出了另一个复杂的解决方案,我只是倒计时并跟踪线程正在使用它也不起作用的对象,但我知道这不是一个可靠的解决方案,而且我知道我将面临意外的情况结果。
我只是想知道是否有相当于 shared_ptr<>
的东西在java中,或者是否可以通过JNI处理对象?
有什么想法吗?
最佳答案
做好你想做的事情需要付出一些努力,并且在 Java 中永远不会感觉自然,因为资源的确定性清理对于 Java 来说是陌生的。不过,自 Java 7 以来,它已经变得更好了一些。
解决这个问题的最佳方法是:
java.util.concurrent.AtomicInteger
类型的计数器添加到您的 java 包装器,初始化为 1(感谢 @Jules 为此,现在避免 synchronized
!) .addRef
方法,该方法在计数器为 0 时抛出异常,返回 this
以便更好地在 try
语句中使用。<java.lang.AutoCloseable
:close
当计数不为0时减少计数,当计数达到0时释放资源。addRef
和 close
.使用 java 包装器的 try-with-resources
block :
try(resource.AddRef()) {
// Do your thing
}
关于java - 如何安全、及时地处置Java中稀缺的共享资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23714853/
我是一名优秀的程序员,十分优秀!