Мне нужно написать bean, который будет действовать как счетчик того, сколько раз он был доступен.
Я думаю использовать @ApplicationScoped
bean с 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);
}
}
Действительно ли операции действительно потокобезопасны?
Говорят, что concurrency аннотации и блокировки должны использоваться при изменении состояния bean, но что, если мой список уже заботится о безопасности потоков?