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)