当普通类的实例没有时,为什么泛型类的实例会在单独的线程上被更改?

时间:2010-02-12 10:36:10

标签: c# .net generics multithreading

当在一个单独的线程上运行的方法中更改对象时,该对象不会在调用线程(启动该方法运行的线程的线程)上更改。 但是,如果定义该对象的类是通用的,则该对象在调用线程上被更改。例如:

我有两个班级:

public class Holder<T> { public T Value {get;set;} }

public class Holder2 { public String Value {get;set;} }

我有一个名为client的第三个对象,它在方法Change()上将Value设置为在不同线程上的不同内容:

static void main(string[] args)
{
    Holder<String> test = new Holder<String>();
    test.Set("original");
    Client client = new client(test);
    client.Change(test);
    Console.WriteLine(test.Value);
    // test.Value now returns "changed"
    // But if test was of type Holder2, it would return "original"
}

基本上客户所做的是:

public class Client
    {
        Holder<String> test;
        public Client(Holder<String> test)
        {
            this.test = test;
        }
        public void Change()
        {
            ThreadStart ts = new ThreadStart(Alter);
        Thread t = new Thread(ts);
        t.Start();
    }

        public void Alter()
        {
        test.Value = "changed";
    }
    }

但是,如果我更改Client类而不是使用Holder2,这不是通用的,它不再起作用。也就是说,test.Value将返回“原始”。任何人都可以向我解释,为什么会这样?

1 个答案:

答案 0 :(得分:5)

由于您不使用锁定,因此存在可能解释您的观察的竞争条件。

另外:请在调用client.Change(test);

后显示如何显示变量