ノンブロッキングアルゴリズムについていくつかの情報を見つけて、実際に使用します。私はいくつかのコードを同期から非ブロックに変更したので、すべてのことを正しく行い、以前の機能を保存しているかどうか尋ねたいと思います。同期メソッドをノンブロッキングアルゴリズムに変換する
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();
}
}
私の代わりに、非ブロッキングアルゴリズムで:
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();
}
私が正しく、すべてをやったか、または私は何かを逃した?コード同期
コードに対する提案と一般的にabjectを設定するためのノンブロッキングメソッドの使用
「this.persistentState.set(newPersistentState)」をのcompareAndSetの更新などをpersistentStateの値 – hahn
compareAndSetは、値をnewPersistentStateに設定した後にのみwhileループから抜け出すため、newPersistentStateに再度設定する必要はありません。それが必要だった場合、これはチェック・ストライクの方法であり、古くなったデータの問題が発生しがちです。ありがたいことに、そうではありません。 – Madhusudhan