当锁没有争用时,锁(...)有多贵?

Joh*_*ell 22 c# concurrency synchronization locking

在查看双重检查锁定时,我看到了许多建议,只是跳过第一次检查并立即进行锁定,然后检查后再进行检查.

这让我想知道,什么时候是lock (this.padlock)"便宜"的?

Mar*_*ell 24

我们可以测试一下......

我明白了:

1000000000; 2164 (no lock)
1000000000; 23258 (lock)
21.094ns per lock
Run Code Online (Sandbox Code Playgroud)

码:

using System;
using System.Diagnostics;

static class P
{
    static void Main()
    {

        Test(1); // for JIT
        Test(1000000);
    }
    static readonly object syncLock = new object();
    static void Test(int count)
    {
        int j = 0;
        var watch = Stopwatch.StartNew();
        for(int i = 0 ; i < count ; i++)
        {
            for (int z = 0; z < 1000; z++)
                j++;
        }
        watch.Stop();
        long withoutMillis = watch.ElapsedMilliseconds;
        Console.WriteLine("{0}; {1} (no lock)", j, watch.ElapsedMilliseconds);

        j = 0;
        watch = Stopwatch.StartNew();
        for (int i = 0; i < count; i++)
        {
            for (int z = 0; z < 1000; z++ )
                lock (syncLock)
                {
                    j++;
                }
        }
        watch.Stop();
        long withMillis = watch.ElapsedMilliseconds;
        Console.WriteLine("{0}; {1} (lock)", j, watch.ElapsedMilliseconds);

        long deltaNano = (withMillis - withoutMillis) * 1000000;
                // nano = 1000 micro = 1000000 milli
        double perLockNano = deltaNano/(1000.0 * count);
        Console.WriteLine("{0}ns per lock", perLockNano);
    }
}
Run Code Online (Sandbox Code Playgroud)


Tud*_*dor 10

根据这个消息来源,锁定和解锁的开销约为20ns.

  • 是的,那是(非常)便宜的. (4认同)