天天看點

關于 C# lock的了解

昨天同僚看了我在項目中用線程下載下傳unity資源的功能,對其中lock的用法不明白,問我是怎麼回事。在這裡我就将這個問題記錄下。

       當我們使用線程的時候,各個線程同時運作,其間不互相依賴和等待。但是當不同的線程都需要通路某個資源的時候,就需要同步機制,也就是說當對同一個資源進行讀寫的時候,我們要使該資源在同一時刻隻能被一個線程操作,以確定每個操作都是有效。lock是C#中最常用的同步方式,格式為lock(lockObject){code} 。

lock(lockObject){code}實際上有三個意思:

       1. lockObject被lock了嗎?沒有則由我來lock,否則一直等待,直至lockObject被釋放。

       2. lock以後在執行code的期間其他線程不能調用code,也不能使用lockObject。

       3. 執行完code之後釋放lockObject,并且code可以被其他線程通路。

lock在使用時的注意點:1、lock的是引用類型的對象,string類型除外。2、lock推薦的做法是使用靜态的、隻讀的、私有的對象。3、保證lock的對象在外部無法修改才有意義,如果lock的對象在外部改變了,對其他線程就會暢通無阻,失去了lock的意義。

private readonly object lockObject = new object();

lock (lockObject)
    {
       //code
    }