多线程线性 lock

本文通过实例演示了C#中如何使用lock关键字确保线程安全,包括针对特定变量的锁来防止并发冲突以及多次锁定同一变量的情况。文章还探讨了死锁的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时我们lock一段代码或许要根据某个变量的值,值相同则不允许有两个或以上的方法并行运行,我在工作中就遇到了,有100个值,相同的参数值不能并行运行。

还有就是一个被lock的方法递归调用会不会死锁,因为需要lock同一个变量。答案当然是不会死锁。

下面是一个测试demo

class Program
    {
        private static object a = new object();
        private static object b = new object();
        private static object c = new object();
        private static Hashtable list = Hashtable.Synchronized(new Hashtable());

        static void Main(string[] args)
        {
            //所有i不相等的线程将同步执行并返回结果
            new Thread(new ParameterizedThreadStart(delegate(object obj) {
                Test(0, 2000);
                Console.WriteLine("1");
            })).Start();

            new Thread(new ParameterizedThreadStart(delegate(object obj)
            {
                Test(1, 2000);
                Console.WriteLine("1+");
            })).Start();

            //所有i==2的线程将顺序执行
            new Thread(new ParameterizedThreadStart(delegate(object obj)
            {
                Test(2, 2000);
                Console.WriteLine("2");
            })).Start();

            new Thread(new ParameterizedThreadStart(delegate(object obj)
            {
                Test(2, 2000);
                Console.WriteLine("3");
            })).Start();

            new Thread(new ParameterizedThreadStart(delegate(object obj)
            {
                Test(2, 2000);
                Console.WriteLine("4");
            })).Start();

            new Thread(new ParameterizedThreadStart(delegate(object obj)
            {
                Test(2, 2000);
                Console.WriteLine("5");
            })).Start();

            new Thread(new ParameterizedThreadStart(delegate(object obj)
            {
                Test(2, 2000);
                Console.WriteLine("6");
            })).Start();

            //两次lock同一变量不会死锁
            new Thread(new ParameterizedThreadStart(delegate(object obj)
            {
                Test2(3, 2000);
                Console.WriteLine("7");
            })).Start();

            Console.ReadKey();
        }

        /// <summary>
        /// 对于i相同的线程进行阻塞保证不会并行多个
        /// </summary>
        /// <param name="i"></param>
        /// <param name="j"></param>
        public static void Test(int i,int j)
        {
            if (!list.ContainsKey(i))
                list.Add(i, DateTime.Now);

            lock (list[i])
            {
                Thread.Sleep(j);
            }
        }
        
        //多次lock同一变量测试是否会死锁
        public static void Test2(int i, int j, bool isFirstRun = true)
        {
            if (!list.ContainsKey(i))
                list.Add(i, DateTime.Now);

            lock (list[i])
            {
                Thread.Sleep(j);
                if (isFirstRun)
                    Test2(i, j, false);
            }
        }
    }

程序输出如下:

1+
2
1
3
7
4
5
6

 

转载于:https://www.cnblogs.com/nanfei/p/6418307.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值