Ik heb het volgende probleem. Ik heb een object dat in zich een reader heeft. Iedereen mag deze reader gebruiken (de Reader is thread safe). Maar zo nu en dan moet er een nieuwe reader opgebouwd worden (de ander is verouderd) en hiervoor moet ik eerst ervoor zorgen dat iedereen die reader weer terug geeft. Daarna mag ik die reader pas closen (als ik hem close terwijl hij in gebruik is treden er exceptions op).
Op het moment dat iedereen die reader heeft terug gegeven, ga ik wat herindexatie werk doen.. een nieuwe reader aanmaken... en deze weer vrijgeven.
Ok.. tot zover wat ik wil.
Wat heb ik bedacht?
In principe gaat dit goed, maar ik zit een beetje in mijn maag met die oneindig aantal vergunningen. Gewoonlijk heb ik een beperkt aantal vergunningen en dan klopt het wel... maar ik ben niet helemaal blij met deze opzet. En verder zijn de volgende operaties denk ik ook vrij duur (ivm oneindig aantal):
readersAvailableSemaphore .release(Integer.MAX_INTEGER)
en
readersAvailableSemaphore .acquireAll();
Ik kan verder wel een constructie bedenken met meerdere synchronisatie bouwstenen, maar de complexiteit neemt daardoor erg toe (en daar ben ik nooit blij mee). Mijn vraag is of er niet een beter synchronisatie bouwsteen is dan deze semafoor. (Misschien een lazy semafoor)
Op het moment dat iedereen die reader heeft terug gegeven, ga ik wat herindexatie werk doen.. een nieuwe reader aanmaken... en deze weer vrijgeven.
Ok.. tot zover wat ik wil.
Wat heb ik bedacht?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| private Reader reader;
private Semaphore readersAvailableSemaphore = new Semaphore(0);
...init methode waardoor readersAvailableSemaphore wordt gezet.
Reader acquireReader()throws InterruptedException{
readersAvailableSemaphore.acquire();
return reader;
}
void releaseReader(){
readersAvailableSemaphore.release();
}
void indexeren(){
//eis alle vergunningen op
readersAvailableSemaphore.acquireAll();
... voer bewerkingen uit op de reader.
reader.close();
reader = new Reader(...);
//maak de reader weer beschikbaar door oneindig
//aantal vergunningen klaar te leggen
readersAvailableSemaphore.release(Integer.MAX_INTEGER)
} |
In principe gaat dit goed, maar ik zit een beetje in mijn maag met die oneindig aantal vergunningen. Gewoonlijk heb ik een beperkt aantal vergunningen en dan klopt het wel... maar ik ben niet helemaal blij met deze opzet. En verder zijn de volgende operaties denk ik ook vrij duur (ivm oneindig aantal):
readersAvailableSemaphore .release(Integer.MAX_INTEGER)
en
readersAvailableSemaphore .acquireAll();
Ik kan verder wel een constructie bedenken met meerdere synchronisatie bouwstenen, maar de complexiteit neemt daardoor erg toe (en daar ben ik nooit blij mee). Mijn vraag is of er niet een beter synchronisatie bouwsteen is dan deze semafoor. (Misschien een lazy semafoor)
[ Voor 16% gewijzigd door Alarmnummer op 07-01-2005 10:11 ]