Mam serwer trochę tak:Bezpieczny dla wątków, ale szybki dostęp do "ostatecznej" zmiennej?
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);
}
}
Jak widać, istnieją wątki obsługi żądań i gwint initing serwer. Żądania mogą nadejść przed zakończeniem wnioskowania, dlatego istnieje czek z IllegalStateException
.
Teraz, aby uczynić ten wątek bezpiecznym (tak, aby wątki obsługi nie pojawiały się po przeterminowaniu, null
, wersja worker
, musiałbym uczynić pracownika zmiennym, zsynchronizować go lub taki.
Jednak po zakończeniu init, worker
nigdy więcej się nie zmieni, więc jest skuteczny. Dlatego wydaje się, że każda kłótnia o zamek, która może wystąpić, byłaby marnotrawstwem. Więc, co jest najbardziej efektywnego, co mogę tutaj zrobić?
Teraz wiem, że to naprawdę nie ma znaczenia w sensie praktycznym (z całym ciężkim uniesieniem czytania żądania sieci, itp., Co ma wspólnego pojedynczy zamek?), Ale chciałbym wiedzieć z ciekawości .
użycie słowa kluczowego "zsynchronizowane" kosztuje wiele cykli. Myślę, że najlepszym sposobem byłoby uczynienie zmiennej 'worker' zmienną' static'. W ten sposób przydzieli zarezerwowaną przestrzeń w pamięci i myślę, że wątki zawsze będą patrzeć na tę przestrzeń. Tylko myśl, może nie być poprawna. –
Czy wywołanie wątku 'worker.work (req)' jest bezpieczne? Po prostu pytam, czy należy zablokować wywoływanie wątków do czasu zainicjowania 'worker'. Czy to jest poprawne? –
@ViktorSeifert Tak, po uruchomieniu 'worker' jest bezpieczny dla wątków. –