Aggiornamento di un oggetto senza blocco o danneggiamento in Java?

0

Supponiamo che tu disponga di un gioco multiplayer in cui diversi thread di giocatori aggiornano costantemente lo stesso stato di gioco. Come aggiornare al meglio questo stato senza subire colli di bottiglia bloccanti o corrompere lo stato del gioco?

Sto pensando a strutture di dati non bloccanti come AtomicInteger , AtomicReference , ecc. Sarebbe corretto e, in caso affermativo, lascio qualcosa fuori? Se no, allora cosa? Grazie!

    
posta Wes 29.10.2017 - 02:29
fonte

2 risposte

2

Il problema che utilizzerai come AtomicInteger è che lo stato del gioco richiederà più valori, molti dei quali potrebbero richiedere un aggiornamento a seguito di una determinata azione del giocatore.

Quindi, mentre puoi essere sicuro che ogni singolo valore dello stato non sarà corrotto, è ancora possibile che lo stato complessivo del gioco si stacchi completamente se diversi thread aggiornano più variabili di stato contemporaneamente.

    
risposta data 22.12.2017 - 09:47
fonte
0

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
}
    
risposta data 21.12.2017 - 14:50
fonte

Leggi altre domande sui tag