在阅读了Jon Skeet article和msdn的this文章之后,我仍然有一个问题
假设我有这段代码:
MyPerson mp = new MyPerson(); //Field
int g=0; //Field
public void DoWork ()
{
int i;
MyPerson mp2 = new MyPerson();
...
}
现在让我说我有2个帖子。运行DoWork
。 (现在让我们忽略,竞争条件)
他们是否会看到相同的g
或每个帖子都有自己的项目? ? (值)
他们是否会看到相同的mp
或者每个帖子都有自己的项目? (实例)
他们是否会看到相同的i
或每个帖子都有自己的项目? (值)
他们是否会看到相同的mp2
或每个帖子都有自己的项目? (实例)
如果他们都看到相同的话,我为什么需要static
?
我搜索了很多关于这个主题的内容,无法找到任何文章,其中说明了:不同的主题,参考类型和价值类型。 。)
答案 0 :(得分:13)
两个线程都没有"运行DoWork
&#34 ;;他们在特定对象上运行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
以引用相同的对象< / em>,然后他们将在同一个物体上争吵;相同的同步/ volatile
规则将适用。
答案 1 :(得分:3)
变量g
和mp
对于包含类是“全局的”,因此它们将是两个线程看到的相同对象。 i
是在DoWork
事件中声明的局部变量;随后这只会对后台/替代线程“可见”。
他们没有'看到'相同,所以在这种情况下static
关键字没有相关性。
我希望这会有所帮助。