C# lock内新开线程造成假锁

C# lock内新开线程造成假锁

C# lock内部新开线程,新开的线程不占有lock, lock对新开的线程无效,造成假锁。

代码示例

using System;
using System.Collections.Generic;
using System.Threading;

namespace SynchronizeDemo
{
    class Program
    {
        private static readonly List<string> Names = new List<string>();
        private static readonly object SyncLock = new object();
        private const string MyName = "尹永贤";

        static void Main()
        {
            lock (SyncLock)
            {
                if (!Names.Contains(MyName))
                {
                    AddSynchronizeName();
                }
            }

            lock (SyncLock)
            {
                if (!Names.Contains(MyName))
                {
                    AddName();
                }
            }

            Thread.Sleep(5000);

            lock (SyncLock)
            {
                foreach (var name in Names)
                {
                    Console.WriteLine(name);
                }
            }

            Console.ReadKey();
        }

        private static void AddName()
        {
            Names.Add(MyName);
        }

        private static void AddSynchronizeName()
        {
            /*/
            //1.常规操作
            Names.Add(MyName);
            /**/

            /**/
            //2.异步操作
            var thread = new Thread(() =>
            {
                Thread.Sleep(2000);
                Names.Add(MyName);
            })
            { IsBackground = true };
            thread.Start();
            /**/
        }
    }
}

  1. 常规操作
  2. 异步操作

新开线程的结果和常规的结果不一样,也就失去了同步的意义。

打赏