当在一个单独的线程上运行的方法中更改对象时,该对象不会在调用线程(启动该方法运行的线程的线程)上更改。 但是,如果定义该对象的类是通用的,则该对象在调用线程上被更改。例如:
我有两个班级:
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将返回“原始”。任何人都可以向我解释,为什么会这样?
答案 0 :(得分:5)
由于您不使用锁定,因此存在可能解释您的观察的竞争条件。
另外:请在调用client.Change(test);
后显示如何显示变量