我用 Java 编写了一个小型 HTTP 服务器,但在将静态变量(服务器配置:端口、根等)传递到处理请求的线程时遇到问题。我不希望我的线程修改这些变量,如果它扩展服务器类,它也会继承我不想要的方法。
出于性能原因,我不想使用 setter/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
}
我也不希望将 worker 作为嵌套类。它在另一个包中...
你有什么建议?
最佳答案
您可以将您的配置放在最终的 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;
}
}
然后你的worker可以通过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>
为根。
关于java - 将静态字段传递给线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10218296/