C#多線程(淺談線程安全)


先擼一段代碼,再說

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ThreadTest0902
{
    public class Program
    {
        bool bl = false;
        static void Main(string[] args)
        {
            Program p = new Program();
            Thread thread = new Thread(p.Print);
            thread.Start();

            p.Print();
            Console.ReadKey();

        }
        public void Print()
        {
                if (!bl)
                {
                    Console.WriteLine("I'm False");
                    bl = true;
                }
        }
    }
}

執行后你會發現,有時候打印一次,有時候會打印兩次

其實大家也能猜到是什么原因了,在第一個線程打印時,bl還是false,另一個線程進判斷語句了,於是也進來打印了

為了避免這樣無法預知的結果,於是我們就想着,在第一個線程(線程A)進行操作上,把門關上,鎖起來,另一個線程(線程B)只能在外面等着,等線程A處理好了,出去了,才可以讓線程B進來

於是微軟爸爸就給了我們把萬能鎖(lock)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ThreadTest0902
{
    public class Program
    {
        bool bl = false;
        static readonly object locker = new object();
        static void Main(string[] args)
        {
            Program p = new Program();
            Thread thread = new Thread(p.Print);
            thread.Start();

            p.Print();
            Console.ReadKey();

        }
        public void Print()
        {
            lock (locker)
            {
                if (!bl)
                {
                    Console.WriteLine("I'm False");
                    bl = true;
                }
            }
        }
    }
}

單獨把這個拿出來說下

static object locker = new object();

一開始我只是寫成object locker = new object();

后來看了網上的代碼,看了下,基本上都是private static readonly於是我就客串下百度

private:如果該實例是public,那么無關的代碼也可能會鎖定該對象,那就會出現多個線程等待同一個對象釋放,導致死鎖

static:同上,如果是公共數據類型也會出現上述問題

readonly:一旦在lock中對象值變了,那么其他線程就可以進來執行了,因為互斥鎖的對象變了

菜鳥寶哥持續更新中...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM