Het threadsafe maken van een applicatie en het toch efficient houden is een moeilijk klusje. Ik zit nu met het volgende probleem:
Nu word 'getTrade' en 'addHit' veel keer per seconden aangeroepen, deze functies zijn en moeten dus efficient blijven. Omdat ze 'alleen data ophalen' hoeven deze niet thread safe te zijn.
Maar 'generateAll()' word 1 keer in het half uur aangeroepen, deze functie manipuleerd de data structures waar 'getTrade' en 'addHit' hun gegevens uit halen. Het kan dus voorkomen dat als 'generateAll' de data structures zit te veranderen 'addHit' of 'getTrade' dezelfde data structures benaderen. Of te wel: een probleem.
Nou kan ik alle 3 methodes voorzien van synchronized keyword:
Dan gaat het goed. Maar dat is verre van efficient, want 'getTrade' en 'addHit' en synchronized niet eens nodig, alleen als 'generateAll' word aangeroepen dan komt de synchronized van pas.
Hoe kan ik er tread safe voor zorgen dat 'getTrade' en 'addHit' even wachten als 'generateAll' bezig is met het veranderen/muteren?
code:
1
2
3
4
5
6
7
8
9
10
11
| Hashtable trades;
Hashtable hits;
public Trade getTrade(String id){
return trades.get(id);
}
public void addHit(Hit hit){
hits.add(hit);
}
public void generateAll(){
//loop door de trades en hits structures, verander, verwijder en voeg toe elementen.
} |
Nu word 'getTrade' en 'addHit' veel keer per seconden aangeroepen, deze functies zijn en moeten dus efficient blijven. Omdat ze 'alleen data ophalen' hoeven deze niet thread safe te zijn.
Maar 'generateAll()' word 1 keer in het half uur aangeroepen, deze functie manipuleerd de data structures waar 'getTrade' en 'addHit' hun gegevens uit halen. Het kan dus voorkomen dat als 'generateAll' de data structures zit te veranderen 'addHit' of 'getTrade' dezelfde data structures benaderen. Of te wel: een probleem.
Nou kan ik alle 3 methodes voorzien van synchronized keyword:
code:
1
| public synchronized void generateAll(){} |
Dan gaat het goed. Maar dat is verre van efficient, want 'getTrade' en 'addHit' en synchronized niet eens nodig, alleen als 'generateAll' word aangeroepen dan komt de synchronized van pas.
Hoe kan ik er tread safe voor zorgen dat 'getTrade' en 'addHit' even wachten als 'generateAll' bezig is met het veranderen/muteren?