[英]Threading in C# , value types and reference types clarification?
在阅读了Jon Skeet 文章和msdn的这篇文章后,我仍然有一个问题
假设我有这段代码:
MyPerson mp = new MyPerson(); //Field
int g=0; //Field
public void DoWork ()
{
int i;
MyPerson mp2 = new MyPerson();
...
}
现在让我们说我有两个主题。 运行DoWork
。 (现在让我们忽略,竞争条件)
他们是否会看到相同的g
或每个线程都有自己的项目? ? (价值)
他们都会看到相同的mp
或每个线程都有自己的项目? (实例)
他们是否会看到相同的i
或每个线程都有自己的项目? (价值)
他们是否会看到相同的mp2
或每个线程都有自己的项目? (实例)
如果他们都看到相同,为什么我需要static
?
我搜索了很多关于这个主题的内容, 但找不到任何文章说明:不同的主题,参考类型和价值类型...)
这两个线程都不是“运行DoWork
”; 他们在特定对象上运行DoWork
。 如果针对不同的实例创建了两个线程,则mp
和g
将是完全独立的字段。 如果创建了针对同一实例的两个线程,则将共享mp
和g
但不保证线程将看到另一个线程所做的更改,除非您使用同步或volatile
访问。
例如:
var obj = new SomeObject();
Thread thread1 = new Thread(obj.DoWork);
Thread thread2 = new Thread(obj.DoWork); // clearly targeting the same instance
VS
var obj = new SomeObject();
Thread thread1 = new Thread(obj.DoWork);
obj = new SomeObject();
Thread thread2 = new Thread(obj.DoWork); // targeting a different instance
局部变量i
和mp2
严格地特定于每个线程。
附加说明:即使它们是独立的域/本地人,如果有的在代码的...
后来重新分配mp
或mp2
指同一个对象 ,那么他们将被争吵不休相同的对象; 相同的同步/ volatile
规则将适用。
变量g
和mp
对于包含类是“全局的”,因此它们将是两个线程看到的相同对象。 i
是在DoWork
事件中声明的局部变量; 随后这只会对后台/替代线程“可见”。
他们没有“看到”相同,所以在这种情况下static
关键字没有相关性。
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.