在局部对象变量上没有volatile,但是每个线程写入不同的属性-这是安全的吗?
本文关键字:属性 安全 线程 变量 对象 局部 volatile | 更新日期: 2023-09-27 18:17:20
给定twoItems
是一个局部变量,没有使用volatile
关键字或任何锁或内存屏障,这段代码安全吗?我认为它仍然是因为一个线程设置First
属性和第二个线程设置Second
属性,但我想确保。如果此代码不可靠,可能无法工作,请建议在这种情况下最好的修复方法。
private void Method()
{
var twoItems = new TwoItems();
Action getFirstItem = () =>
{
Thread.Sleep(2000);
twoItems.First = new Item { SomeInt = 1, SomeString = "1" };
};
Action getSecondItem = () =>
{
Thread.Sleep(2000);
twoItems.Second = new Item { SomeInt = 2, SomeString = "2" };
};
Task.WaitAll(
Task.Factory.StartNew(getFirstItem),
Task.Factory.StartNew(getSecondItem));
Console.WriteLine(twoItems.First.SomeString
+ twoItems.Second.SomeString);
}
class TwoItems
{
public Item First { get; set; }
public Item Second { get; set; }
}
class Item
{
public int SomeInt { get; set; }
public string SomeString { get; set; }
}
所讨论的代码不属于"线程安全"问题,因为线程安全具体是关于多个线程如何与相同的数据交互。
由于您的代码不与相同的数据交互,因此它不完全属于该问题。
这里的共享对象是具有这两个属性的对象,但在本例中这不会造成任何问题。
这样,代码将不会有竞争条件或锁定问题或缺乏锁的问题,因此将按预期运行。