gpt4 book ai didi

java - 如果一个 ServerSocket 被垃圾回收,它的关联端口绑定(bind)会发生什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:39 25 4
gpt4 key购买 nike

我想创建一个可以检测自身的其他实例并阻止它们运行的​​应用程序。为此,我正在考虑在某些特定于应用程序的端口上打开一个新的 ServerSocket ,然后依赖在我尝试多次绑定(bind)到同一端口时应该抛出的异常“检测”并杀死重复的应用程序实例。我知道我可以做一些事情,比如将文件写入当前工作目录并“检测”它以完成相同类型的行为,但我真的不想这样做(如果应用程序死了会发生什么? t 删除文件?),所以这就是我选择 ServerSocket 路由的原因。

假设我有以下代码:

public class MyClass{
public static void main(String[] args) throws IOException{
new ServerSocket(1234);

new Thread(){
//This is a non-daemon thread. Assume its run() method never returns.
}.start();
}
}

问题

如果不创建 ServerSocket,我的应用程序就再也不需要使用它了,因为它的存在让我能够检测到我的应用程序的另一个实例何时尝试启动。因此,保存对所述 ServerSocket 的引用将导致编译警告(未使用的引用)。我是个爱整洁的人,所以如果可以避免的话,我宁愿不保存引用资料。我的问题是,这个 ServerSocket 实例是否会在所有非守护线程退出之前被垃圾收集(假设应用程序没有失败或以其他方式退出),如果是这样,它的关联端口是否会解除绑定(bind)结果呢?

最佳答案

我很困惑:你是一个“整洁的怪胎”,但宁愿让垃圾收集器随心所欲地关闭套接字,也不愿在正常退出的情况下让应用程序控制关闭程序? (我假设是这种情况,因为要建立这样的机制,您需要持有一个引用,从而消除您认为的问题。)

就其值(value)而言,如果您不坚持引用,我认为在实践中实际上不会有问题:

  • 在内部,很可能在绑定(bind)套接字时保留一个引用
  • 很可能在垃圾回收时调用 ServerSocket 的 close() 方法。它在 AbstractPlainSocketImpl 的 finalize() 方法中调用,因此原则上会被调用,但不能保证任何 finalize 方法都会实际被调用。
  • 如果应用程序异常终止,则无法保证套接字立即解除绑定(bind),尽管在最近的 O/Ses 上很可能(最好测试这个)。

但是,我真的建议为您的应用程序完全关闭的情况编写一个“干净”的关闭机制,为此您需要保留对套接字的引用。所以我认为你真的是在为自己发明一个问题,如果你只是使用明智的编程实践,那么这个问题就不需要存在。

关于java - 如果一个 ServerSocket 被垃圾回收,它的关联端口绑定(bind)会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694018/

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