Ik heb een klasse (Y) die een hoofdklasse (X) "extend". Als ik nu in klasse Y een aantal synchronized methoden heb, en een non-synchronized methode met nested synchronization block, hoe lock ik dan hetzelfde object?
In pseudo-code:
Een aantal threads "wacht" in Y.lock(); Na een bepaald event wordt Y.test() aangeroepen. Nu blijven de threads in Y.lock() echter wachten.
Ik heb met google gezocht, en er zojuist "Concurrent programming in Java" van Doug Lea op nageslagen, maar kan nergens duidelijk vinden hoe ik dit oplos.
Als ik het synchronized blok uit lock() weghaal, en de hele methode synchronized maak, is het probleem opgelost. Dit wil ik echter niet vanwege het feit dat deze methode zeer vaak wordt aangeroepen, en er eigenlijk alleen gelocked moet worden als er niet aan een conditie voldaan wordt, die vrijwel nooit voorkomt.
Kortom: als synchronisatie in een methode op een ander object synchroniseerd als een volledig gesynchroniseerde methode, hoe zorg ik er dan voor dat ze elkaar wel "zien"?
In pseudo-code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| class X {} class Y extends X { public synchronized void test() { ... notifyAll(); } public void lock() { while (!conditie)) { synchronized(this) { try { wait(); } catch(InterruptedException e) {} } } } } |
Een aantal threads "wacht" in Y.lock(); Na een bepaald event wordt Y.test() aangeroepen. Nu blijven de threads in Y.lock() echter wachten.
Ik heb met google gezocht, en er zojuist "Concurrent programming in Java" van Doug Lea op nageslagen, maar kan nergens duidelijk vinden hoe ik dit oplos.
Als ik het synchronized blok uit lock() weghaal, en de hele methode synchronized maak, is het probleem opgelost. Dit wil ik echter niet vanwege het feit dat deze methode zeer vaak wordt aangeroepen, en er eigenlijk alleen gelocked moet worden als er niet aan een conditie voldaan wordt, die vrijwel nooit voorkomt.
Kortom: als synchronisatie in een methode op een ander object synchroniseerd als een volledig gesynchroniseerde methode, hoe zorg ik er dan voor dat ze elkaar wel "zien"?