静态方法或变量是在静态代码区,程序加载时就存在了,直到程序退出. 代码共用 内存中只有一份拷贝
class Program { public static void func() { Console.WriteLine("begin {0}",DateTime.Now); Thread.Sleep(10000); Console.WriteLine("end {0}", DateTime.Now); }
static void Main(string[] args) { Thread t1 = new Thread(new ThreadStart(func)); Thread t2 = new Thread(new ThreadStart(func)); t1.Start(); Thread.Sleep(2000); t2.Start(); } }
静态方法是可以并发调用的,是否可以安全的并发调用取决于内部静态属性的设计。
其实是微软为他们提供的类库所提供的一个保证,也就是说,微软承诺这些方法可以安全的多线程使用。并不表示线程安全和静态方法有任何关系。 如果我们要在自己的类库中暴露静态方法,也应该给用户与类似承诺。大多数时候,静态方法并不会造成线程安全的问题。问题往往出现在静态字段上。对于这些字段的读写,应该尽量暴露相应的方法或属性,内部进行Lock,以确保给予用户上面的承诺。 |