在并行应用程序中,线程组中的线程(32)使用共享的、非托管的和独立的一次性对象。
我们的c/c++应用程序中也有相同的东西,我使用shared_ptr<>来让对象在不需要对象之后进行处理和完成。
我只是尝试在Java中应用相同的东西,然后我面对了finalize()方法。但是也存在一些问题,因为GC有时太懒,对象甚至不能被识别为无法处理/完成的对象,有时被调用,但是没有保证GC允许对象完全调用finalize()。
因此,我提出了另一个复杂的解决方案,我只是数数和跟踪线程使用的对象,但它也不工作,但我知道这不是一个可靠的解决方案,我知道我会面临意想不到的结果。
我只是想知道在java中是否存在类似于shared_ptr<>的东西,还是可以通过JNI来处理对象?
有什么想法吗?
发布于 2014-05-17 19:17:52
做您想做的事情需要付出一定的努力,而且在Java中永远不会觉得很自然,因为对资源的确定性清理对于Java来说是陌生的。不过,从Java 7开始,它已经变得更好了。
解决这一问题的最佳方法是:
java.util.concurrent.AtomicInteger类型的计数器,初始化为1(谢谢@Jules的支持,现在避免使用synchronized!)。addRef方法,如果计数器为0,该方法将抛出返回this,以便更好地在try-statement中使用。java.lang.AutoCloseable:当计数达到0时,close会减少计数,当计数达到0时释放资源。addRef和close。使用java包装器的try-with-resources-block:
try(resource.AddRef()) {
// Do your thing
}发布于 2014-05-17 19:09:10
在Java和 when an object is collected中没有强制“销毁”对象的通用方法(可能永远不会!)
人们通常需要担心的唯一资源是文件或流等外部资源--处理这种情况的一般方法--它通过close/AutoClosable使用手动生存期管理(如果使用终结器,则只使用“安全性”)。生存期完全留在调用方中,过早“关闭”资源(例如文件)将使其在其他地方无效。
这种手动管理可以通过获取/发布池来完成(当所有获取被释放时,“使用计数”变为零,并在基础资源上调用close );如果可以预先固定计数,则使用信号量进行更改。
另一方面,内部管理但不可访问的对象/资源将根据GC的需要被逐出,因此(通常)不需要担心它们的生命周期。
发布于 2014-05-17 19:11:24
您可以创建一个简单的manager对象,它知道如何创建和处理所述资源。在对象上实现同步的checkout()和checkin()方法。签出方法在第一次调用时创建对象,增加引用计数,并返回对对象的引用。签入方法会减少引用计数,当它变为零时,它会处理该对象。然后,您只需使用try/finally模式(类似于锁/解锁)对对象的所有使用范围进行范围:
Resource res = manager.checkout();
try {
// ... work with resource here ...
} finally {
manager.checkin(res);
}注意,使用java 7 AutoCloseable可能会使它变得更干净一些。
https://stackoverflow.com/questions/23714853
复制相似问题