为什么线程中的locke 没有锁住呢

2019-01-03 03:57发布

详见下面的代码:

private static object asynclocker = new object();
        private static List<string> processingOrders = new List<string>();

 private static bool CheckSession(string orderid)
        {
            lock (asynclocker)
            {
                bool isExists =  processingOrders.Find(s => s.ToLower().Trim() == orderid.ToLower().Trim()) == null;
                if (isExists)
                {
                    processingOrders.Add(orderid.ToLower().Trim());
                }

                return isExists;
            }
        }


使用:
//正在处理中
                    if (!CheckSession(notifyModel.OutTradeId))
                    {
                        throw new JSJException("订单正在处理中……");
                    }

测试代码:

 List<Task<string>> tasks = new List<Task<string>>();

            for (var i = 0; i<=5; i++)
            {
                tasks.Add(Task.Factory.StartNew<string>(() =>
                {
                    return this.PayOrder();
                }));
            }

            Task.WaitAll(tasks.ToArray());

            foreach (var task in tasks)
            {
                Console.WriteLine(task.Result);
            }

结果:

success
订单正在处理中……
success
订单正在处理中……
订单正在处理中……
订单正在处理中……

 

请教大神们这是什么原因呢?

标签: 线程
1条回答
放我归山
2楼-- · 2019-01-03 04:11

lock (asynclocker) { bool isExists = processingOrders.Find(s => s.ToLower().Trim() == orderid.ToLower().Trim()) == null; if (isExists) { processingOrders.Add(orderid.ToLower().Trim()); } return isExists; }

 这是作用域,执行完那么asynclocker 就Exit()了;

你还想怎么锁 —— 不让第二次执行?不让第二次执行,你只需要拿个静态变量累加并判断。

查看更多
登录 后发表回答