.NET 9  Lock   C# 

 C# 13 

 lock


C#  使
class MultiThreadCode
{
    private readonly object _syncObj = new object();

    public void Run()
    {
        lock (_syncObj)
        {
            // いろんなスレッドから同時に呼ばれるコード。
        }
    }
}

Java (= 1995) Java  synchronized 

lock()  ()  lock () 
class Resource;

class MultiThreadCode
{
    private readonly Resource _someResource = new();

    public void Run()
    {
        lock (_someResource)
        {
            // _someResource に対する操作をする。
            // _someResource を同時に操作されると困るんだから、「_someResource を lock」。
        }
    }
}

 lock (x) { x  }  lock 1 object _syncObj 


class MultiThreadCode
{
    public void Run()
    {
        // ✖
        // 任意のオブジェクトでロックできるということは、this でも行ける!
        lock (this)
        {
            // いろんなスレッドから同時に呼ばれるコード。
        }
    }

    public static void StaticRun()
    {
        // ✖
        // 静的メソッド内では this がない…
        // そうだ、Type 型もオブジェクトじゃん!
        lock (typeof(MultiThreadCode))
        {
            // いろんなスレッドから同時に呼ばれるコード。
        }
    }
}


var x = new MultiThreadCode();

// ここの lock と、MultiThreadCode.Run 内の lock (this) が同じオブジェクトをロックする。
// 意図しない挙動のはず。
lock (x)
{
}

class MultiThreadCode
{
    public void Run()
    {
        lock (this)
        {
            // いろんなスレッドから同時に呼ばれるコード。
        }
    }
}


var x = new MultiThreadCode();

// ここの lock と、MultiThreadCode.Run 内の lock (_items) が同じオブジェクトをロックする。
lock (x.Items)
{
}

class MultiThreadCode
{
    // private だから一見外に漏れてない。
    private readonly List<int> _items = [];

    public void Run()
    {
        lock (_items)
        {
            // _items に Add/Remove とかしたり。
        }
    }

    // List としては公開していないものの、
    // インスタンス自体は _items そのままなので…
    public IEnumerable<int> Items => _items;
}

_items  object _syncObj = new(); 

.NET  


 lock 


Add first class System.Threading.Lock type


:


Locking on any class has overhead from the dual role of the syncblock as both lock field and hashcode et al.

(syncblock )


syncblock 


Object header get complicated


27使使

GetHashCode  lock  GetHashCode   lock 

(lock  override  object.GetHashCode )

 Lock  private readonly Lock _syncObj = new(); 

System.Threading.Lock 


 .NET 9  Lock (System.Threading )  (.NET 9 Preview 1  Preview 2 )  RequiresPreviewFeatures 

C#  lock () 使
using System.Runtime.Versioning;

// 今のペースなら、.NET 9 正式リリースまでには外れる気はする。
[module: RequiresPreviewFeatures]

class MultiThreadCode
{
    private readonly Lock _syncObj = new();

    public void Run()
    {
        // C# コンパイラーに手を入れないとしたらこんな使い方に。
        // lock じゃなくて using。
        using (_syncObj.EnterScope())
        {
            // いろんなスレッドから同時に呼ばれるコード。
        }
    }
}

Lock lock 使 C++ (AwareLock) C#    syncblock 使

lock  Lock 


Lock  lock 使 Lock  lock (x)  using (x.EnterScope())   lock (x)   lock (x) 

C#  ( RequiresPreviewFeatures )


Lock object


lock (x)  lock (x)  using (x.EnterScope()) 

 Visual Studio 17.10.0 Preview 2.0 (3) ILSpy  using (_syncObj.EnterScope()) 
class MultiThreadCode
{
    private readonly Lock _syncObj = new();

    public void Run()
    {
        // C# コンパイラーが特殊対応することになったので、lock でOKに。
        lock (_syncObj)
        {
            // いろんなスレッドから同時に呼ばれるコード。
        }
    }
}

 Lock   Lock 
// これは現状、既存の lock (Monitor.TryEnter を使ったコード)になる。 
lock (new MyLock())
{
}

// System.Threading.Lock と同じパターンのメソッド持ちの自作クラス。
class MyLock
{
    public Scope EnterScope() => default;

    public ref struct Scope
    {
        public void Dispose() { }
    }
}