On Dec 7, 2012, at 8:01 PM, Steve Sisak wrote:

> Here's what I usually do:
> 
> assume that _someDictionary is an instance variable initialized to nil and 
> never changed once initialized to non-nil
> 
> - (NSDictionary *)someDictionary;
> {
>  if (!_someDictionary)
>  {
>    @synchronized (self)
>    {
>      if (!_someDictionary)
>      {
>        // create a temp dictionary (might take some time)
>         _someDictionary = temp;
>      }
>    }
>  }
> 
>  return _someDictionary;
> }
> 
> the outer if avoids the overhead of @synchronized if _someDictionary is 
> already created -- this is just an optimization
> 
> the inner if is necessary to resolve the race condition if multiple threads 
> make it past the outer one

This is a classic anti-pattern called double-checked locking.  It is not safe.  
Don't rely on it.
https://en.wikipedia.org/wiki/Double-checked_locking
http://erdani.com/publications/DDJ_Jul_Aug_2004_revised.pdf

Regards,
Ken


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to