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

Tom*_*ter 0 .net c# generics multithreading

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

我有两节课:

public class Holder<T> { public T Value {get;set;} }
Run Code Online (Sandbox Code Playgroud)

public class Holder2 { public String Value {get;set;} }
Run Code Online (Sandbox Code Playgroud)

我有一个名为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"
}
Run Code Online (Sandbox Code Playgroud)

基本上客户端做的是:

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";
    }
    }
Run Code Online (Sandbox Code Playgroud)

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

Mor*_*dur 5

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

另外:请在调用client.Change(test)后显示如何显示变量;