Let's say you have a multiplayer game where different player threads are constantly updating the same game state. How do you best update this state without suffering locking bottlenecks or corrupting the game state?
Una possibile risposta è trattare gli aggiornamenti dei giocatori in competizione come eventi , piuttosto che manipolazioni dirette dello stato del gioco. Gli eventi del giocatore vengono accodati in una coda e il thread "stato del gioco" estrae gli eventi dalla coda per determinare lo stato del gioco.
Trisha Gee ha scritto una serie di saggi su Disruptor e l'architettura LMAX; il disruptor è un design privo di blocco per una coda che potrebbe essere utilizzata in questo modo. Un'interessante scelta di progettazione in disgregatore è che supporta la lettura di eventi in batch.
Se l'approccio al lavoro condiviso non è soddisfacente, allora un'alternativa da considerare è AtomicReference , che consente di confrontare e scambiare la semantica su un oggetto radice e, quindi, sui riferimenti di raggiungere in grado da quel riferimento di root. Il modello core è simile a
V currentState = reference.get()
V nextState = computeNewState(currentState)
if (reference.compareAndSet(currentState, nextState) {
// Success: you have updated the shared state!
} else {
// you lost the data race
}