在.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次结果:

新lock性能测试1

新lock性能测试2

新lock性能测试3

通过3次性能测试,发现新Lock的方式比原先使用object的性能提升最差的时候提升17%,早好的试试提升33%.在.Net 9及以后得版本中,请使用新的Lock方式

秋风 2024-07-21