私の問題は次のとおりです。
授業がある:
public class AtomicStringBuilder {
private final AtomicReference<StringBuilder> sbRef;
}
新しい文字を StringBuilder に同時にアトミックに追加する必要があります。しかし、問題は、最後の 128 文字だけがこのオブジェクトに含まれている必要があることです。操作はノンブロッキングでなければならないため、StringBufferを使用できません。
したがって、次の 2 つの操作があります。
最初: StringBuilder に既に 128 文字があるかどうかを確認します。
2番目:そうでない場合->新しい文字を追加し、ある場合->最初の文字を削除して新しい文字を追加します。
この 2 つまたは 3 つの操作をアトミックにする方法はありますか?
このメソッドを作成しましたが、機能しません:
public void append(String string) {
this.sbRef.getAndUpdate(ref -> {
if (ref.length() < 128) {
ref.append(string);
} else {
ref.append(string).delete(0, ref.length() - 128);
}
return ref;
});
}
テストのために、このメソッドを作成しました:
public void test() {
AtomicStringBuilder atomicStringBuilder = new AtomicStringBuilder();
Random random = new Random();
Stream<Integer> infiniteStream = Stream.iterate(0, i -> random.nextInt(10));
infiniteStream.parallel()
.limit(100000)
.forEach(integer -> atomicStringBuilder.append(String.valueOf(integer)));
assertEquals(128, atomicStringBuilder.getSb().get().length());
}
これは実際の問題ではありません。AtomicReference を変更して、動作する他のものに変更できます。タスクは、ロックフリーで競合状態のない操作を作成することです