Ho un assistente un po 'come questo:Accesso sicuro ai thread ma veloce a una variabile "finale finale"?
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);
}
}
Come si può vedere, ci sono discussioni gestione delle richieste e un filo initing server. Le richieste possono arrivare prima che l'inita sia finita, quindi c'è il controllo con un IllegalStateException
.
Ora, per rendere questo thread-safe (così le discussioni richiesta del gestore non si vede una stantia, null
-valued, versione di worker
subito dopo init), avrei dovuto fare lavoratore volatili, sincronizzare su di esso, o qualche come.
Tuttavia, dopo che l'init è stato completato, worker
non cambierà mai più, quindi è effettivamente definitivo. Pertanto, sembra che qualsiasi conflitto di blocco che potrebbe verificarsi sarebbe uno spreco. Quindi, qual è la cosa più efficiente che posso fare qui?
Ora so che non importa in senso pratico (con tutto il peso della lettura di una richiesta di rete, ecc., Cosa importa una singola serratura?), Ma mi piacerebbe sapere per curiosità .
utilizzando la parola chiave 'sincronizzata' costa un sacco di cicli. Penso che il modo migliore sarebbe quello di rendere statica la variabile 'worker'. In questo modo assegnerà uno spazio riservato nella memoria, e penso che i fili guarderanno sempre a quello spazio. Solo un pensiero, potrebbe non essere corretto. –
L'invocazione del thread 'worker.work (req)' è sicuro? Sto solo chiedendo di assicurarmi di aver solo bisogno di bloccare i thread chiamanti fino a quando 'worker' è stato inizializzato. È corretto? –
@ViktorSeifert Sì, una volta 'worker' è lì, è thread-safe. –