Concorrenza Java

3

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 price pa1 the prices pa2, pa3, and pa4 arrive, the next price the application should process is pa4 and all previous prices should be ignored. Prices for other entities (e.g. pb1) do not affect the latest price entity for a, but are processed independently in the same way with respect to entity b.

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);
}
  1. Garantirà una lettura / scrittura sicura dei thread?
  2. Se scrivo sulla chiave "a" bloccherà l'intera mappa o le scritture su "b" la chiave è disponibile?
  3. 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?
posta Wild Goat 02.11.2015 - 21:10
fonte

1 risposta

1

Dalla documentazione di ConcurrentHashMap :

However, even though all operations are thread-safe, retrieval operations do not entail locking, and there is not any support for locking the entire table in a way that prevents all access.

Per rispondere alle tue prime due domande:

  1. ConcurrentHashMap è garantito come thread-safe.

  2. Durante la scrittura, può accadere più di una scrittura alla volta. Dalla documentazione:

The allowed concurrency among update operations is guided by the optional concurrencyLevel constructor argument (default 16), which is used as a hint for internal sizing. The table is internally partitioned to try to permit the indicated number of concurrent updates without contention.

Ciò significa che avere un livello di concorrenza pari a 1 significherà che puoi eseguire solo una scrittura alla volta. Avere un livello di concorrenza pari a 16 significa che possono verificarsi fino a 16 scritture contemporaneamente.

Infine:

3.What does take following part of the task means? If during the time taken to process price Pa1 the prices Pa2, Pa3, and Pa4 arrive, then the next price the application should process is Pa4 and all previous prices should be ignored.

Ecco la mia interpretazione: si inizia elaborando un prezzo, in questo caso Pa1. Alla fine dell'elaborazione di Pa1, stai cercando di elaborare il prezzo successivo. Durante l'elaborazione di Pa1, hai ricevuto Pa2, Pa3 e Pa4. Quando selezioni il prezzo successivo da elaborare, dovresti ignorare Pa2 e Pa3 perché sono vecchi e elaborano solo Pa4.

Questo sembra un problema di compiti a casa, quindi non voglio semplicemente dare una soluzione, ma devi escogitare un modo in cui elabori solo il prezzo più recente che hai ricevuto. Puoi farlo utilizzando una singola variabile priceToProcess che viene aggiornata ogni volta che ricevi un nuovo prezzo, oppure puoi utilizzare Queue e riempirla con i prezzi ricevuti (l'ultimo nella coda sarà quello che elaborerai), ecc. C'è sicuramente più di un modo per realizzare questa parte.

Forse un punto di confusione è l'idea di elaborare un prezzo - non devi necessariamente elaborare un prezzo solo perché lo hai ricevuto. Elaborate un prezzo solo quando non elaborate un altro prezzo e non ci sono prezzi più nuovi da elaborare.

    
risposta data 02.11.2015 - 23:14
fonte

Leggi altre domande sui tag