以该程序为例:
class Program
{
public static double myVar1 = 0;
public static double myVar2 = 0;
static void Main()
{
Thread thread1 = new Thread(new ThreadStart(update_variable));
thread1.Start();
while (true)
{
myVar2 = myVar1;
}
}
static update_variable()
{
while (true)
{
myVar1 = 2222222.22;
myVar1 = 1111111.11;
}
}
}
myVar2是否有可能等于222222.22或1111111.11之外的其他值?换句话说,变量的字节是“全有还是全无”更改,或者在某些字节已更改而其他字节未更改而给出意外值的情况下,主线程是否可以在某个实例中看到myVar1?
我已经测试了上面的程序,但是没有看到这种行为,但是想知道是否有可能,是否将其视为线程安全代码。我宁愿不使用锁的资源,因为我只有一个更改数据的线程和一个使用数据的线程。
答案 0 :(得分:2)
要回答您的问题,是的,这是可能的;当其他线程读取该值时,double
中的某些字节可能会更新,因此将包含损坏的数据。
如果您对自动读写方式感兴趣,但又不使用lock
,建议您看看Interlocked类,它支持一组有限的原子操作。