通常使用volatile
来完成。但是如果long
或double
是不可能的话。
也许只是让它public
就足够了,然后编译器知道这可以被另一个程序集使用而不会“优化它”?这可以依靠吗?其他一些方式?
要清楚,我并不担心同时读/写变量。只有一件事 - 它没有得到优化。 (比如https://stackoverflow.com/a/1284007/939213。)
答案 0 :(得分:0)
防止代码删除的最佳方法是使用代码。
如果你担心在你的例子中优化while循环
class Test
{
long foo;
static void Main()
{
var test = new Test();
new Thread(delegate() { Thread.Sleep(500); test.foo = 255; }).Start();
while (test.foo != 255) ;
Console.WriteLine("OK");
}
}
你仍然可以使用volatile来修改你的while循环
volatile int temp;
//code skipped in this sample
while(test.foo != 255) { temp = (int)foo;}
现在假设您确定没有任何线程安全问题。你正在使用你的长foo,所以它不会被优化掉。因为你只是想让它保持活力,所以你不必担心失去任何一部分时间。
如果您执行此类操作,请务必清楚地标记代码。可能写一个包装你的long(和你的volatile int)的VolatileLong类,以便其他人了解你在做什么
其他线程安全工具(如锁)也会阻止代码删除。例如,编译器足够智能,不会像这样在sinleton模式中删除double。
if (_instance == null) {
lock(_lock) {
if (_instance == null) {
_instance = new Singleton();
}
}
}
return _instance;