通过引用修改线程安全对象集合中的对象项时,线程锁是如何工作的

本文关键字:对象 线程 何工作 工作 修改 引用 安全 集合 | 更新日期: 2023-09-27 17:49:41

我有一个线程安全的对象集合,例如c# MemoryCache。我们知道,在这个集合中添加、更新和删除项目等操作是安全的。但是,如果我通过引用更新集合中对象项的属性,首先,它是线程安全的吗?同步是如何工作的?它会在每一行属性更新时被锁定吗?

class MyClass
{
     public int Val1 { get; set; }
     public int Val2 { get; set; }
}
class Program
{
    public static MemoryCache MyCache = new MemoryCache("test");
    static void Main(string[] args)
    {

        MyCache.Add("1", new MyClass() {Val1 = 0, Val2 = 0}, new CacheItemPolicy());
        new Thread(() => {
            MyClass item = (MyClass)MyCache["1"];                
            for (int i = 0; i < 100000; i++)
            {
                item.Val1 =  item.Val1 + i;
            }
        }).Start();
        new Thread(() =>
        {
            MyClass item = (MyClass)MyCache["1"];
            for (int i = 100000; i < 200000; i++)
            {
                item.Val1 =  item.Val1 + i;
            }
        }).Start();

通过引用修改线程安全对象集合中的对象项时,线程锁是如何工作的

但是如果我通过更新集合中对象项的属性参考,首先,它是线程安全的吗?

同步是如何工作的?

将没有同步写读写属性。

将被锁定的每一行属性更新?