在.Net 9中新增Lock方式
前言
在看.Net Runtime源码时,发现.Net BCL库已经开始使用新Lock的方式代替旧方式了.新Lock方式使用也很简单.看看以下这几个提交:示例代码
using System.Threading;
using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Order;
namespace CSharpBenchmarks.SystemTest
{
[MemoryDiagnoser]
[DisassemblyDiagnoser(printSource: true)]
[Orderer(SummaryOrderPolicy.FastestToSlowest)]
public class LockTest
{
private readonly static object obj = new();
private readonly static Lock @lock = new(); //新的方式,不再使用object而是使用Lock
[Benchmark]
public async Task<long> LockObject()
{
long count = 0;
var tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
tasks[i] = Task.Run(() =>
{
for (int j = 0; j < 1000000; j++)
{
lock (obj)
{
count += 1;
}
}
});
}
await Task.WhenAll(tasks);
return count;
}
[Benchmark]
public async Task<long> LockAPI()
{
long count = 0;
var tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
tasks[i] = Task.Run(() =>
{
for (var j = 0; j < 1000000; ++j)
{
lock (@lock) //lock
{
count += 1;
}
}
});
}
await Task.WhenAll(tasks);
return count;
}
}
}
看一下性能测试3次结果:
通过3次性能测试,发现新Lock的方式比原先使用object的性能提升最差的时候提升17%,早好的试试提升33%.在.Net 9及以后得版本中,请使用新的Lock方式
秋风
2024-07-21