У меня есть сервер несколько, как это:Потоковый сейф, но быстрый доступ к «окончательной конечной» переменной?
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);
}
}
Как вы можете видеть, есть потоки обработки запросов и поток initing сервер. Запросы могут появиться до завершения инициализации, поэтому есть чек с IllegalStateException
.
Теперь, чтобы сделать эту поточно (так обработчик запросов потоки не видим несвежие, null
-значные, версию worker
только после инициализации), я должен был бы сделать рабочий изменчивы, синхронизировать на нем, или некоторые например.
Однако после завершения инициализации worker
больше не изменится, так что это действительно окончательный вариант. Поэтому кажется, что любой конфликт блокировок, который может произойти, будет пустой тратой. Итак, что самое эффективное, что я могу сделать здесь?
Теперь я знаю, что это практически не имеет значения в практическом смысле (при всем тяжелом подъеме чтения сетевого запроса и т. Д., Что имеет дело с одним замком?), Но я хотел бы узнать из любопытства ,
с использованием ключевого слова «synchronized» стоит много циклов. Я думаю, что лучшим способом было бы сделать переменную 'worker'' static'. Таким образом, он выделит зарезервированное пространство в памяти, и я думаю, что потоки всегда будут смотреть на это пространство. Просто мысль, возможно, неверна. –
Является ли обращение к потоку 'worker.work (req)' safe? Я просто прошу убедиться, что вам требуется только блокировать вызовы потоков до тех пор, пока «worker» не будет инициализирован. Это верно? –
@ViktorSeifert Да, однажды «рабочий» там, он потокобезопасен. –