在c#中创建线程安全变量
本文关键字:安全 变量 线程 创建 | 更新日期: 2023-09-27 18:15:27
我有一个静态变量,由多个对象中的多个线程访问。问题是,如果我在一个线程中设置值,它不会反映在另一个线程中。为了解决这个问题,我使变量线程静态,但仍然在一个线程中更改的值确实反映在另一个线程中。这就是我声明变量的方式:
[ThreadStatic]
public static string ThreadVar;
对于如何解决这个问题有什么建议吗?
编译器和JIT可以自由地假设字段不会被多个线程更改,并且如果可以证明当前线程不能在两次获取之间更改值,则可以优化删除对同一字段的重新获取。
标记字段volatile
传达了相反的信息:您希望该字段被外力(包括其他线程)更改,并且编译器/JIT 不能优化任何重新读取。
注意,标记字段volatile
并不立即意味着该字段的所有使用都是线程安全的,它只意味着一个线程会注意到当另一个线程向该字段写入新值时。我们需要查看更多的代码来确定是否存在线程安全问题。
[ThreadStatic]
,在比较中,告诉编译器,每个线程应该有自己的变量副本,根据你的问题,这不是你想要的。