java 如何解决多线程环境下的内存泄漏?

ctehm74n  于 2023-01-04  发布在  Java
关注(0)|答案(1)|浏览(253)

我有一个在多线程环境中内存泄漏的有趣案例。我有以下逻辑:

public void update(string key, CustomObj NewResource)
{
  //fetch old resource for the given key from the concurrent hashmap
  // update hashmap with the newResource for the given key
  // close the old resource to prevent memory leak    
}

public void read (string key)
{
   // return resource for the given key
}

现在,如果我有两个线程:
Thread#1:调用update方法来更新密钥K的资源
Thread#2:调用read方法来读取相同键K的资源。

注意:CustomObj属于第三方库,因此我无法将finalize方法放入其中以关闭它。

即使在读取和更新方法上使用同步也无济于事,因为更新线程可以在读取线程仍在使用资源时关闭资源。
您能告诉我们在这种情况下如何保持线程安全而不发生内存泄漏吗?

ve7v8dk2

ve7v8dk21#

由于过于宽泛的原因,您不应该使用finalize()
如果多个线程可以同时处理一个对象,那么您可以使用“引用计数”来跟踪何时应该关闭资源。
当前处理该对象的每个线程/函数/等在获得对该对象的访问权时,其“用户数”会加1。当它停止处理该对象时,其“用户数”会减1。将计数减为零的线程会关闭该对象。您可以利用java标准库提供的各种“原子”原语来创建无锁解决方案。
由于这是一个来自第三方库的对象,您需要创建某种 Package 器来跟踪引用。
PS:通常在线程间使用具有共享状态的对象不是一个好主意--这会招致麻烦--同步问题、数据竞争、同步中的性能损失等。

相关问题