Finden Sie nur einige Informationen über nicht blockierende Algorithmen, also wollen Sie sie in der Praxis verwenden. Ich habe den Code von synchron auf nicht blockierend geändert, also möchte ich fragen, ob ich alles richtig gemacht und die vorherige Funktionalität gespeichert habe.Konvertieren Sie synchronisierte Methoden zu nicht blockierenden Algorithmus
synchronisierten Code:
protected PersistentState persistentState;
protected ClassConstructor(final ID id)
{
super(id);
this.persistentState = PersistentState.UNKNOWN;
}
public final synchronized PersistentState getPersistentState()
{
return this.persistentState;
}
protected synchronized void setPersistentState(final PersistentState newPersistentState)
{
if (this.persistentState != newPersistentState)
{
this.persistentState = newPersistentState;
notifyPersistentStateChanged();
}
}
meine Alternative in nicht-blockierenden Algorithmus:
protected AtomicReference<PersistentState> persistentState;
protected ClassConstructor(final ID id)
{
super(id);
this.persistentState = new AtomicReference<PersistentState>(PersistentState.UNKNOWN);
}
public final PersistentState getPersistentState()
{
return this.persistentState.get();
}
protected void setPersistentState(final PersistentState newPersistentState)
{
PersistentState tmpPersistentState;
do
{
tmpPersistentState = this.persistentState.get();
}
while (!this.persistentState.compareAndSet(tmpPersistentState, newPersistentState));
// this.persistentState.set(newPersistentState); removed as not necessary
notifyPersistentStateChanged();
}
Muss ich habe alles richtig gemacht, oder ich etwas verpasst? Irgendwelche Vorschläge für den Code und die Verwendung der nicht blockierenden Methode für das Setzen von abject im Allgemeinen?
Sie nicht „this.persistentState.set (newPersistentState)“ als compareAndSet Updates verwenden sollten Wert von persistentState – hahn
Das compareAndSet wird aus der while-Schleife erst dann ausbrechen, nachdem der Wert auf newPersistentState festgelegt wurde, und es daher nicht erneut auf newPersistentState festgelegt wird, wie bereits erwähnt. Wenn es erforderlich wäre, dann wäre dies ein Check-take-Act-Weg, der anfällig für veraltete Datenprobleme ist. Zum Glück ist es nicht. – Madhusudhan