C#中的lock-誰先拿到令牌誰先玩

多線程中一些線程互斥的操作,比如需要獨佔資源時,需要關起門來一個人玩,這時就需要一個鎖,等這個線程玩完了,鎖就開了,剩下的線程誰先搶到鎖誰玩。

下面的例子是取貨,其它的用例比如多線程通訊中要獨佔端口。

using System;
using System.Threading;

namespace ThreadingDemo
{
    class Program
    {
        int done = 10;
        static readonly object locker = new object();

        static void Main(string[] args)
        {
            Program p = new Program();

            Random rd = new Random();
            

            Thread a = new Thread(new ThreadStart(delegate { p.Go("~~子線程", rd.Next(1, 10)); }));
            a.Start();


            p.Go("主線程~~",rd.Next(1, 10));
            Console.WriteLine("主線程結束了!!!");
            if (a.IsAlive)
                Console.WriteLine("子線程還沒結束!!!");
            else
                Console.WriteLine("子線程結束了!!!");

            Console.ReadKey();
        }

        void Go(string m , int n)
        {
            //取消lock的註釋看效果
            // lock (locker)
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(m + "正在取貨");
                    
                }
                if (done >= n)
                {
                    done = done - n;
                    Console.WriteLine(m + "取到貨了,取完還剩"+done);
                }
                else
                    Console.WriteLine(m + "沒取到貨,因爲只剩" + done);
            }
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章