0

我有一个静态变量,可由多个对象中的多个线程访问。问题是如果我在一个线程中设置值,它不会反映在另一个线程中。为了解决这个问题,我将变量线程设为静态,但一个线程中更改的值仍然会反映在另一个线程中。这就是我声明变量的方式:

[ThreadStatic]
public static string ThreadVar;

关于如何解决问题的任何建议?

4

1 回答 1

4

编译器和 JIT 可以自由地假设字段不会被多个线程更改,并且如果可以证明当前线程在两次读取之间不能更改值,则可以优化相同字段的重新读取。

标记该字段volatile传达相反的信息:您希望该字段被外力(包括其他线程)更改,并且编译器/JIT不得优化任何重新获取。

请注意,标记该字段volatile并不立即意味着该字段的所有使用都是线程安全的,它仅意味着当另一个线程将新值写入该字段时,一个线程会注意到。我们需要查看更多代码以确定是否存在线程安全问题。

[ThreadStatic]相比之下,它告诉编译器每个线程都应该有自己的变量副本,根据您的问题,这根本不是您想要的。

于 2014-07-28T14:50:34.757 回答