アクセス回数のカウンターとして機能する Bean を作成する必要があります。
私は@ApplicationScoped
ビーンをAtomicInteger
そのように使うことを考えています
@ApplicationScoped
class VisitsCounter {
private AtomicInteger counter;
@PostConstruct
public void construct() {
counter = new AtomicInteger(0);
}
public int visited() {
return counter.incrementAndGet();
}
}
私の質問は、複数のリクエストを同時に検討しても大丈夫ですか? @ConcurrencyManagement
それとも、@Lock
注釈をいじる必要がありますか? これでうまくいくAtomic*
はずですが、よくわかりません。
フィールドとしてスレッドセーフなコレクションを持っている場合にも同じことが当てはまりますか? たとえば、私が持っていると言う
@ApplicationScoped
class ValuesHolder {
private List<String> values;
@PostConstruct
public void construct() {
values = Collections.synchronizedList(new LinkedList<String>());
}
public void insert(String value) {
values.add(value);
}
public String remove(String value) {
return values.remove(value);
}
}
操作は本当にスレッドセーフですか?
Bean の状態が変更された場合は、同時実行アノテーションとロックを使用する必要があると言われていますが、リストが既にスレッド セーフを処理しているとしたらどうでしょうか。