【问题标题】:passing static fields to a thread将静态字段传递给线程
【发布时间】:2012-04-18 21:28:07
【问题描述】:

我用 Java 编写了一个小型 HTTP 服务器,但在将静态变量(服务器配置:端口、根等)传递给处理请求的线程时遇到问题。我不希望我的线程修改这些变量,如果它扩展了服务器类,它也会继承我不想要的方法。

出于性能原因,我不想使用 getter。如果我将静态成员设为最终成员,则在从配置文件加载它们的值时会遇到问题。

这是一个例子

class HTTPServer {
static int port; 
static File root;
etc..
....
//must be public
public void launch() throws HTTPServerException {
    loadConfig();
    while (!pool.isShutdown()) {
            ....
        //using some config here
             ...
        try {
    Socket s = ss.accept();
    Worker w = new Worker(s);
    pool.execute(w);
        }catch () {...}
    }
}
private void loadConfig(){ //reading from file};
...
other methods that must be public goes here
}

我也不想让工人作为嵌套类。它在另一个包中...

你有什么建议?

【问题讨论】:

  • 首先正确编码(即使用 getter 和其他所有内容),稍后您可以担心性能。
  • 这些应该是HTTPServer 的常规非静态最终字段,作为构造函数参数传入。此外,不要过早优化——getter 几乎不需要任何成本,除非另有说明。
  • 在我看来,你问我们如何把它弄得一团糟。
  • 您正在处理一个网络。相比之下,getter 的开销是微不足道的,即使对于经常读取的字段,你提到的字段肯定不是。

标签: java multithreading static final


【解决方案1】:

您可以将您的配置放入最终的AtomicReference。然后它可以被您的工作人员引用并以线程安全的方式更新。

类似:

class HTTPServer {
  public static final AtomicReference<ServerConf> config = 
    new AtomicReference(new ServerConf());
}

使新的ServerConf 类不可变:

class ServerConf {
  final int port;
  final File root;
  public ServerConf(int port, File root) {
    this.port = port;
    this.root = root;
  } 
}

然后您的工作人员可以通过HTTPServer.config.get() 获取对当前配置的引用。可能是这样的:

Worker w = new Worker(s, HTTPServer.config.get());

loadConfig() 可以通过以下方式设置新配置:

HTTPServer.config.set(new ServerConf(8080, new File("/foo/bar"));

如果同时更改所有配置并不重要,您可以跳过ServerConf 类并使用AtomicInteger 进行端口设置,并使用AtomicReference&lt;File&gt; 作为根。

【讨论】:

    【解决方案2】:

    将静态数据读入一个静态“sharedConfig”对象,该对象也有一个套接字字段——您可以将该字段用于监听套接字。当 acccpet() 返回 server 客户端套接字时, clone() 'sharedConfig',插入新套接字并将该对象传递给 server 客户端工作线程。然后线程获取配置的副本,它可以删除甚至修改它,而不影响任何其他线程或静态配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      相关资源
      最近更新 更多