2

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

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

这是一个例子

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
}

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

你有什么建议?

4

2 回答 2

2

您可以将您的配置放在最终的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<File>根目录。

于 2012-04-18T21:37:49.200 回答
0

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

于 2012-04-18T21:37:30.827 回答