Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过引用修改线程安全对象集合中的对象项时线程锁的工作方式_C#_Multithreading_Synchronization_Thread Safety_Memorycache - Fatal编程技术网

C# 通过引用修改线程安全对象集合中的对象项时线程锁的工作方式

C# 通过引用修改线程安全对象集合中的对象项时线程锁的工作方式,c#,multithreading,synchronization,thread-safety,memorycache,C#,Multithreading,Synchronization,Thread Safety,Memorycache,我有一个线程安全的对象集合,例如c#MemoryCache。如我们所知,在该集合中添加、更新和删除项等操作是安全的。但如果我通过引用更新集合中某个对象项的属性,首先,它是线程安全的吗?同步是如何工作的?是否会在每次属性更新时锁定它 class MyClass { public int Val1 { get; set; } public int Val2 { get; set; } } class Program { public static MemoryCach

我有一个线程安全的对象集合,例如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();
class-MyClass
{
公共int Val1{get;set;}
公共int Val2{get;set;}
}
班级计划
{
公共静态MemoryCache MyCache=新的MemoryCache(“测试”);
静态void Main(字符串[]参数)
{
Add(“1”,new MyClass(){Val1=0,Val2=0},new CacheItemPolicy());
新线程(()=>{
MyClass项=(MyClass)MyCache[“1”];
对于(int i=0;i<100000;i++)
{
item.Val1=item.Val1+i;
}
}).Start();
新线程(()=>
{
MyClass项=(MyClass)MyCache[“1”];
对于(int i=100000;i<200000;i++)
{
item.Val1=item.Val1+i;
}
}).Start();
非常感谢您的建议

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

没有

同步是如何工作的

将不会同步写入/读取属性

是否会在每次属性更新时锁定它

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();

不。

你已经有了测试它的代码。当你运行它时发生了什么?结果看起来是线程安全的。但是我在一些博客上读到它不是线程安全的,所以我想查看更多的评论。所以你在问问题之前就知道了问题的答案?那么,如果你已经知道答案,为什么还要问这个问题呢?@sramaskthivel说他做了研究,发现它不安全,尽管被告知它不安全,但还是假设它是安全的,再次询问,并被告知他以前已经发现的东西,它不安全。谢谢dugas,但是当我运行测试代码时(上面),它给出了一个线程安全的结果。那会是怎样的?@JustinMathew您是如何验证结果的?有几个原因可以让您获得正确的结果(例如单核cpu、cpu体系结构、内存模型等)。您的示例绝对不是线程安全的。@Servy-我不确定我的测试是否正确,我所做的是,我创建了三个线程来对一个属性(Val1)求和,并在执行后得到正确的和。您能告诉我吗?我如何证明它不是线程安全的。