Ho una lista Array di oggetti che possono essere aggiunti / cancellati / aggiornati tramite chiamate REST. Al fine di prevenire problemi che potrebbero derivare da accessi concorrenti, un ReadWriteLock sarà appropriato ed efficiente?
Un database con garanzie ACID è quasi sicuramente un modo migliore per farlo rispetto al tentativo di mantenere un ArrayList in memoria, per diversi motivi:
Se hai bisogno di tempi di consegna estremamente rapidi su dati che non cambiano molto, prendi in considerazione l'aggiunta di una cache come Redis o utilizzando oggetti memoizzati che vengono popolati dal tuo database.
In realtà è piuttosto semplice, una versione sincronizzata andrà bene, renderà sicuro l'accesso alla lista TRANNE nel caso in cui è necessario iterare su di esso. Se hai bisogno di iterare su di esso, ci sono un paio di modi.
Per quanto riguarda le prestazioni delle operazioni sincronizzate, non me ne preoccuperei - sarà più lento di un elenco non sincronizzato ma di qualche ordine di grandezza più veloce di quello del disco.
Ora, se un oggetto recuperato dall'elenco può essere aggiornato da due thread contemporaneamente, deve avere il proprio meccanismo di sincronizzazione interna (spesso è possibile utilizzare la business logic per precludere questa possibilità).
Vorrei usarlo e poi vedere se hai un problema di velocità, se lo fai ci sono schemi per evitare la sincronizzazione, ma ci vuole un po 'più di pensiero e codifica. (Il più sicuro è probabilmente usando un oggetto lista da una collezione funzionale)
Andare al database come suggerito da Robert è meglio - fallo prima e se è troppo lento, allora metti in cache le informazioni internamente.