用于关闭连接的Java弱引用

用于关闭连接的Java弱引用,java,weak-references,Java,Weak References,当我的对象被描述时,我正试图找出关闭服务连接的最佳方法 我有这样的想法: class something { public final LongConnection lc; public something () { lc = new LongConnection (); lc.initConnection (); new Thread (new Runnable () { public void run () { Referen

当我的对象被描述时,我正试图找出关闭服务连接的最佳方法

我有这样的想法:

class something {
  public final LongConnection lc;
  public something ()  {
    lc = new LongConnection ();
    lc.initConnection ();
    new Thread (new Runnable () { 
      public void run () { 
        ReferenceQueue<LongConnection> rq = new ReferenceQueue<LongConnection> ();
        WeakReference<LongConnection> wr = new WeakReference<LongConnection> (lc, rq);

        // now it should start listening for the object to be added to the queue
        while (true) {
          Reference<? extends LongConnection> ref = rq.remove ();
          if (rq != null) { 
            rq.get ().shutdown ();
            break;
          }
        }
        // will fall through and die! 
      }
    }).start ()
  }
somefunction () { 
  something = new something ()
}
当该方法返回(并且是descoped/gc'd)时,它将正确地关闭连接

问题: (1) 这真的很糟糕吗?!?! (2) 它会工作吗(测试正在进行中)?
(3) 关闭某些东西的“正确”方式是什么?如果可以避免的话,我不想将关机问题提升到程序的下一层。

是的:在Java中,将任何资源的管理与内存管理结合起来是一种不切实际的做法。除了内存管理之外,其他一切都必须明确地完成。Java7引入了一个名为“自动资源管理”的有用的新构造,它有助于处理所涉及的样板文件

具体而言,您没有得到以下方面的任何保证:

  • 当JVM意识到对象是弱可达的时
  • 弱参考将被清除的时间
  • JVM将通过将其排入引用队列来通知您这一事实

  • 稀缺资源的垃圾收集,如SQL
    ResultSet
    语句
    连接
    或文件句柄,不会关闭资源。您应该在获取它的方法范围内的finally块中执行此操作。

    确实如此-这意味着不要执行此操作?此连接的作用域不能仅限于函数或类。它实际上是一个由“something”类封装的共享资源。所以不要这样做?不管你有什么问题,使用弱引用并不能解决它,但会带来另一个问题。这就是我担心的:/你需要引入一种机制,在适当的时候显式调用它。