On 7 February 2014 10:25, TC <chalu...@gmail.com> wrote:
> On Friday, 31 January 2014 at 08:25:16 UTC, Andrej Mitrovic wrote:
>>
>> class LockSingleton
>> {
>>     static LockSingleton get()
>>     {
>>         __gshared LockSingleton _instance;
>>
>>         synchronized
>>         {
>>             if (_instance is null)
>>
>>                 _instance = new LockSingleton;
>>         }
>>
>>         return _instance;
>>     }
>>
>> private:
>>     this() { }
>> }
>
>
> Should't be the LockSingleton implemented like this instead?
>
> class LockSingleton
> {
>     static auto get()
>     {
>         if (_instance is null)
>         {
>             synchronized
>             {
>                 if (_instance is null)
>
>                     _instance = new LockSingleton;
>             }
>         }
>
>         return _instance;
>     }
>
> private:
>     this() { }
>     __gshared LockSingleton _instance;
> }
>
> At least this is the way singleton is suggested to implement in C#, because
> synchronization is then needed only for initial instantiation and not
> allways.

We don't want double-checked locking. :)

This was discussed at dconf, the D way is to leverage native thread
local storage.  I seem to recall that when David tested this, GDC had
pretty much near identical speeds to unsafe gets().

You'll have to consult the slides, but I think it was something like:

class LockSingleton
{
    static auto get()
    {
        if (!_instantiated)
        {
            synchronized (LockSingleton.classinfo)
            {
               if (_instance is null)
                    _instance = new LockSingleton;
                _instantiated = true;
            }
        }
        return _instance;
    }

  private:
    this() { }
    static bool _instantiated;
    __gshared LockSingleton _instance;
}

Reply via email to