Testing some singleton implementations
Dmitry Olshansky
dmitry.olsh at gmail.com
Sat Feb 1 13:23:38 PST 2014
01-Feb-2014 18:23, Stanislav Blinov пишет:
> On Friday, 31 January 2014 at 23:35:25 UTC, Stanislav Blinov wrote:
>
>>>> // (2)
>>>> if (!atomicLoad!(MemoryOrder.raw)(_instantiated))
>>>> {
>>>> // (1)
>>>> synchronized
>>>> { // <- this is 'acquire'
>>>> if (_instance is null) {
>>> //(3)
>>>> _instance = new AtomicSingleton;
>>>> }
>>>>
>>>> } // <- this is 'release'
>>>>
>>> //(4)
>>>> // This store cannot be moved to positions (1) or (2)
>>>> because
>>>> // of 'synchronized' above
>>>> atomicStore!(MemoryOrder.raw)(_instantiated, true);
>>>> }
>>>>
>>>
>>> No it's not - the second thread may get to (3)
>>> while some other thread is at (4).
>>
>> Nope. The only way the thread is going to end up past the null
>> check is if it's instantiating the singleton. It's inside the
>> locked region. As long as the bool is false one of the threads
>> will get inside. the synchronized block, all others will lock.
>> Once that "first" thread is done, the others will see a non null
>> reference. No thread can get to 4 until the singleton is created.
>
> To clarify: only one thread will ever get to position (3). All others
> that follow it will see that _instance is not null, thus will just leave
> the synchronized section. Of course, this means that some N threads
> (that arrived to the synchronized section before the singleton was
> created) will all write 'true' into the flag. No big deal :)
Yes, I see there could be many writes to _instantiated field but not
_instance.
--
Dmitry Olshansky
More information about the Digitalmars-d
mailing list