在局部对象变量上没有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; }
}

在局部对象变量上没有volatile,但是每个线程写入不同的属性-这是安全的吗?

所讨论的代码不属于"线程安全"问题,因为线程安全具体是关于多个线程如何与相同的数据交互。

由于您的代码不与相同的数据交互,因此它不完全属于该问题。

这里的共享对象是具有这两个属性的对象,但在本例中这不会造成任何问题。

这样,代码将不会有竞争条件或锁定问题或缺乏锁的问题,因此将按预期运行。