私はこのようなサーバーを持っています:
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
値のバージョンを認識しないようにするため)、worker を volatile にするか、同期するか、またはそのような作業を行う必要があります。worker
ただし、init が完了すると、worker
再び変更されることはないため、事実上最終的なものになります。したがって、発生する可能性のあるロック競合は無駄に思えます。では、ここで私ができる最も効率的なことは何ですか?
実用的な意味ではあまり重要ではないことはわかっていますが (ネットワーク リクエストを読み取るなどの面倒な作業をすべて行うと、単一のロックがどのような意味を持つのでしょうか?)、好奇心から知りたいと思います。