Ik zat even rond te neuzen in commons-dbcp waar het lazy-loading singleton pattern wordt toegepast. De 'instance' method is synchronized met daarboven wat commentaar:
In mijn hoofd zit nu dit:
Ik vraag me nu af of het byte-reorder probleem is getackeld en het sync block zelf voor de safe publication zorgt. wie kan de correctheid beredeneren?
uiteraard kan het ook worden opgelost met een static container/holder, maar das lastig met excepties
Wat inderdaad logischerwijs niet gaat werken. Maar aangezien ik aan het vrijdag middag nerderig dagdromen ben vroeg ik me af of het probleem niet vrij simpel getackeld kan worden. Het is immers een publishing probleem.It is tempting to use the "double checked locking" idiom in an attempt to avoid synchronizing on every single call to this method.
In mijn hoofd zit nu dit:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| public class Singleton { private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { if (instance == null) { final Singleton temp = new Singleton(); instance = temp; } } } return instance; } } |
Ik vraag me nu af of het byte-reorder probleem is getackeld en het sync block zelf voor de safe publication zorgt. wie kan de correctheid beredeneren?
uiteraard kan het ook worden opgelost met een static container/holder, maar das lastig met excepties
[ Voor 2% gewijzigd door Verwijderd op 18-05-2007 16:33 . Reden: even zonder mutex ]