我有一个有点像这样的服务器:
class Server {
private WorkingThing worker;
public void init() {
runInNewThread({
// this will take about a minute
worker = new WorkingThing();
});
}
public Response handleRequest(Request req) {
if (worker == null) throw new IllegalStateException("Not inited yet");
return worker.work(req);
}
}
如您所见,有处理请求的线程和初始化服务器的线程。请求可以在初始化完成之前进入,因此有一个IllegalStateException
.
现在,为了使这个线程安全(所以请求处理程序线程看不到 init 之后的陈旧、null
-valued 版本worker
),我必须使 worker 不稳定,在其上同步,或诸如此类。
但是,在 init 完成后,worker
将不再更改,因此它实际上是 final 的。因此,任何可能发生的锁争用似乎都是一种浪费。那么,我在这里能做的最有效的事情是什么?
现在我知道这在实际意义上并不重要(阅读网络请求等繁重的工作等等,单个锁有什么关系?),但出于好奇,我想知道。