zoukankan      html  css  js  c++  java
  • 深入理解c#中的lock

    lock只能使用引用类型,严格来说是需要对象的实例。即使对象在意义上是相同的,但是如果不是ReferenceEquals的话,那么将作为两个实例来对待,那么C# lock 的就不是同一个东西。也就是说,当你以为这个 lock 生效的话,它其实在做无用工。

    测试用例:

    using System;
    using System.Threading;
    
    class TTT
    {
        private hello test;
    
        public TTT(hello t)
        {
            this.test = t;
        }
    
        public void DoTransactions()
        {
            lock (test)
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString());
                }
            }
        }
    }
    
    
    class hello
    {
        internal int i;
    }
    
    
    class Test
    {
        static void Main()
        {
            Thread[] threads = new Thread[10];
            //TTT acc = new TTT(new hello());  //启用此处,lock会生效,因为lock的是同一个实例
            for (int i = 0; i < 10; i++)
            {
                TTT acc = new TTT(new hello());  //启用此处,lock不会生效,因为lock的不是同一个实例
                Thread t = new Thread(new ThreadStart(acc.DoTransactions));
                threads[i] = t;
            }
            for (int i = 0; i < 10; i++)
            {
                threads[i].Start();
            }
    
            Console.ReadLine();
        }
    }
    
    
    
  • 相关阅读:
    Android一些问题
    内存泄漏(Memory Leak)
    内存溢出OOM
    Android面试题集合
    Handler之同步屏障机制(sync barrier)
    IdleHandler 原理浅析
    OkHttp原理
    RxJava操作符
    Android电量优化全解析
    Android内存优化大盘点
  • 原文地址:https://www.cnblogs.com/tianzhiliang/p/1809564.html
Copyright © 2011-2022 走看看