2012-07-16 44 views
3

我有下面的代码。这可能是愚蠢的问题,但我不确定,如果同步是必要的或不。ThreadStatic和Synchronization


class MyClass 
{ 
    [ThreadStatic] 
    private static object _staticObject; 
    private static readonly LockStaticField = new object(); 

    public static object StaticObject 
    { 
    get 
    { 
     lock(LockStaticField) 
     { 
      return _staticObject ?? (_staticObject = new object()); 
     } 
    } 
    } 
} 

我知道ThreadStatic领域不需要任何同步,因为国家不共享。但是,关于静态getter和初始化是什么?

回答

8

我知道ThreadStatic字段不需要任何同步,因为状态不是共享的。但是,关于静态getter和初始化是什么?

这也不需要锁定来同步,因为数据(后台字段)对每个线程都是唯一的。您可以放心地在这里取出锁。

请注意,从.NET 4开始,您可能还想考虑使用ThreadLocal<T>而不是[ThreadStatic]来保存任何本地线程数据。在使用方面有几个优点(即:IsValueCreated),但也有一些优点,您可以拨打Dispose()直接清除所有线程上的所有实例。

+0

好吧,让我们考虑一个长时间运行的初始化,它将被调度程序明确地中断。 (是的,我知道我不应该在一个getter中调用这样的初始化,这只是一个假设情况。) – DHN 2012-07-17 07:11:05

+0

@DHN无关紧要,因为只有*那个线程会受到影响,并且会在反正初始化。 – 2012-07-17 15:55:03

+0

好的。谢谢。 :O) – DHN 2012-07-18 06:46:48

相关问题