0

私の問題は次のとおりです。

授業がある:

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 を変更して、動作する他のものに変更できます。タスクは、ロックフリーで競合状態のない操作を作成することです

4

1 に答える 1