Sto lavorando per risolvere un problema concorrente interessante! Non sono sicuro di averlo capito correttamente poiché sono un po 'confuso.
The system needs to process the prices, and typically they cannot be processed as quickly as they arrive, so the implementation must sample the latest price. The external system produces prices for several entities, interleaved into a single sequence of the form:
EntityA: pa1, pa2, pa3... EntityB: pb1, pb2, pb3 ... Time ▶ ▶ ▶For example, if during the time taken to process pricepa1
the pricespa2
,pa3
, andpa4
arrive, the next price the application should process ispa4
and all previous prices should be ignored. Prices for other entities (e.g.pb1
) do not affect the latest price entity fora
, but are processed independently in the same way with respect to entityb
.
Per sicurezza dei thread volevo usare ConcurrentMap
ConcurrentHashMap<String, BigDecimal> concurrentHashMap = new ConcurrentHashMap<String, BigDecimal>();
public BigDecimal getPrice(String id){
return concurrentHashMap.get(id);
}
public void updatePrice(String id, BigDecimal newPrice){
concurrentHashMap.put(id, newPrice);
}
- Garantirà una lettura / scrittura sicura dei thread?
- Se scrivo sulla chiave
"a"
bloccherà l'intera mappa o le scritture su"b"
la chiave è disponibile? - Cosa significa seguire una parte del compito? Se durante il tempo impiegato per elaborare il prezzo Pa1 i prezzi Pa2, Pa3 e Pa4 arrivano, allora il prezzo successivo che l'applicazione dovrebbe elaborare è Pa4 e tutti i prezzi precedenti dovrebbero essere ignorati. - Probabilmente sto complicando le cose ma ciò significa che non dovrei archiviare e annullare l'aggiornamento del prezzo se arriva un nuovo prezzo più recente? Se sì, come sarebbe l'implementazione?