2010-10-11 37 views
1

在C#中,一个类级别的变量不是线程安全的(任何例外情况?请告诉我)。所以我将不得不将这个变量的用法(比如在同一个类中的方法中)封装在一个锁中。为什么实例化类中需要锁?不是每个实例都有自己的数据等吗?

但是,使用new的想法使我认为每个类实例都有自己的实例等,并且一个实例变量永远不会共享,所以对该方法的调用永远不会看到任何共享数据。那么为什么一个实例化的类需要锁定它的类级变量呢?只有当两个线程访问相同的内存地址时才需要锁,但我认为情况总是如此。

感谢

回答

4

您可以创建一个类的实例,并从多个线程访问它。例如:

MyClass classInstance = new MyClass(); 
Task.Factory.StartNew(() => 
     { 
      classInstance.DoSomething(); 
     }); 

Task.Factory.StartNew(() => 
     { 
      classInstance.DoSomething(); 
     }); 

这两个任务将执行在后台线程,并使用相同的实例 - 由“Children子”的一个指向。如果类是可变的,这需要同步。

1

相同的对象实例可以同时由多个线程调用方法。

1

主题可以共享内存,这是什么让你来回传递数据。进程阻止你直接共享内存。因此,同一进程中的另一个线程理论上可以同时访问一个变量。

0

只有当两个线程访问相同的内存地址时才需要锁,但我认为这总是不会如此?

它并不总是这样,不,它取决于你如何编写你的程序。

如果你的程序从不同的线程改变了同一个实例,你需要某种形式的锁定来防止它们踩到别人的脚趾。

如果您只在一个线程中访问您的类的实例,则不需要锁定。

+0

不可变(初始化)类型:-) – 2010-10-11 23:05:24

相关问题