Quando interagisci con un ArrayList su REST, ReadWriteLock mantiene la consistenza?

1

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?

    
posta SVN600 08.07.2016 - 16:40
fonte

2 risposte

2

Un database con garanzie ACID è quasi sicuramente un modo migliore per farlo rispetto al tentativo di mantenere un ArrayList in memoria, per diversi motivi:

  1. Scala in scala.
  2. Manterrà le garanzie stateless di REST.
  3. Non devi preoccuparti che il cane inciampi sul cavo di alimentazione.
  4. La concorrenza è già stata fatta per te.

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.

    
risposta data 08.07.2016 - 19:07
fonte
0

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.

  • Crea una copia dell'elenco, quindi esegui un'iterazione sulla copia (nota che questo copierà solo la matrice puntatore della lista, non gli oggetti in essa contenuti - operazione abbastanza veloce).
  • inserisce sincronizzato (lista) {} attorno al ciclo di iterazione - questo bloccherà la collezione per tutto il tempo dell'iterazione, ma non ne farà una copia.

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.

    
risposta data 11.07.2016 - 23:48
fonte

Leggi altre domande sui tag