Thread synchronization

xs0 xs0 at xs0.com
Thu Nov 30 04:04:48 PST 2006


Sean Kelly wrote:
> JohnC wrote:
>> What's the recommended way to guard static variables?
>>
>> 1) synchronized by itself?
>>
>>   static Object getObj() {
>>     synchronized {
>>       return sharedVar;
>>     }
>>   }
>>
>> 2) synchronized on classinfo?
>>
>>   static Object getObj() {
>>     synchronized (typeof(sharedVar).classinfo) {
>>       return sharedVar;
>>     }
>>   }
>>
>> 3) synchronized on a static Object instance?
>>
>>   static this() {
>>     syncLock = new Object;
>>   }
>>
>>   static Object getObj() {
>>     synchronized (syncLock) {
>>       return sharedVar;
>>     }
>>   }
>>
>> I've seen all these patterns used. Are they all safe?
> 
> They're all safe.  Since #1 is in a static method, it will synchronize 
> on the ClassInfo object, just like you're doing manually in #2.  And #3 
> just specifies a separate static object on which to synchronize.  But 
> since it's static, you'll get the same effect.

I think the first one synchronizes only on the statement itself, so 
while only one getObj can execute concurrently, it doesn't guard against 
a similar setObj()..

xs0



More information about the Digitalmars-d-learn mailing list