在C#中,一个类级别的变量不是线程安全的(任何例外情况?请告诉我)。所以我将不得不将这个变量的用法(比如在同一个类中的方法中)封装在一个锁中。为什么实例化类中需要锁?不是每个实例都有自己的数据等吗?
但是,使用new的想法使我认为每个类实例都有自己的实例等,并且一个实例变量永远不会共享,所以对该方法的调用永远不会看到任何共享数据。那么为什么一个实例化的类需要锁定它的类级变量呢?只有当两个线程访问相同的内存地址时才需要锁,但我认为情况总是如此。
感谢
在C#中,一个类级别的变量不是线程安全的(任何例外情况?请告诉我)。所以我将不得不将这个变量的用法(比如在同一个类中的方法中)封装在一个锁中。为什么实例化类中需要锁?不是每个实例都有自己的数据等吗?
但是,使用new的想法使我认为每个类实例都有自己的实例等,并且一个实例变量永远不会共享,所以对该方法的调用永远不会看到任何共享数据。那么为什么一个实例化的类需要锁定它的类级变量呢?只有当两个线程访问相同的内存地址时才需要锁,但我认为情况总是如此。
感谢
您可以创建一个类的实例,并从多个线程访问它。例如:
MyClass classInstance = new MyClass();
Task.Factory.StartNew(() =>
{
classInstance.DoSomething();
});
Task.Factory.StartNew(() =>
{
classInstance.DoSomething();
});
这两个任务将执行在后台线程,并使用相同的实例 - 由“Children子”的一个指向。如果类是可变的,这需要同步。
相同的对象实例可以同时由多个线程调用方法。
主题可以共享内存,这是什么让你来回传递数据。进程阻止你直接共享内存。因此,同一进程中的另一个线程理论上可以同时访问一个变量。
只有当两个线程访问相同的内存地址时才需要锁,但我认为这总是不会如此?
它并不总是这样,不,它取决于你如何编写你的程序。
如果你的程序从不同的线程改变了同一个实例,你需要某种形式的锁定来防止它们踩到别人的脚趾。
如果您只在一个线程中访问您的类的实例,则不需要锁定。
不可变(初始化)类型:-) – 2010-10-11 23:05:24