Ho bisogno di scrivere un bean che agisca da contatore di quante volte è stato effettuato l'accesso.JEE6 @Application Bean e concorrentopropato
Sto pensando di utilizzare @ApplicationScoped
fagioli con AtomicInteger
come quella
@ApplicationScoped
class VisitsCounter {
private AtomicInteger counter;
@PostConstruct
public void construct() {
counter = new AtomicInteger(0);
}
public int visited() {
return counter.incrementAndGet();
}
}
La mia domanda è: è ok quando si considera più richieste allo stesso tempo? O devo giocare con le annotazioni @ConcurrencyManagement
e @Lock
? Suppongo che lo Atomic*
debba fare il trucco ma non ne sono sicuro.
Lo stesso vale anche quando si dispone di raccolte thread safe come campi? Per esempio. dire che ho
@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);
}
}
sono le operazioni davvero thread-safe?
Si dice che le annotazioni e le serrature di concorrenza debbano essere utilizzate in caso di modifica dello stato del bean, ma cosa succede se la mia lista si occupa già della sicurezza dei thread?
Come implementato, non vedo alcun problema di concorrenza. – McDowell