C# 1 lock object
C# 1 lock object
C# 1 lock object
.ET 9 引入了一个新的 Lock 类型 System.Threading.Lock
.ET 9 Preview 1 中的 Lock 类型
我们可以使用这一类型代替 lock
的对象来改进锁的性能
我们来做一个简单的 benchmark
代码语言:javascript代码运行次数:0运行复制[SimpleJob]
[MemoryDiagnoser]
public class LockObjectBenchmark
{
private readonly object _lock0 = new();
private readonly Lock _lock1 = new();
[Benchmark(Baseline = true)]
public int ewLockObject()
{
var i = 0;
Parallel.For(1, 1000, _ =>
{
lock (_lock1)
{
Interlocked.Increment(ref i);
}
});
return i;
}
[Benchmark]
public int TraditionalLock()
{
var i = 0;
Parallel.For(1, 1000, _ =>
{
lock (_lock0)
{
Interlocked.Increment(ref i);
}
});
return i;
}
}
benchmark-result
从结果可以看得出来新的锁的类型性能更好,分配更少
默认地 lock
会使用 Monitor
是实现锁,我们使用 lock
默认就是 Monitor
的语法糖,难以扩展
lock-implemention
.ET 9 引入的 System.Threading.Lock
类型实现一定程度上的自定义,只是目前是针对这个 type 做了特殊处理,未来可能会制定一个规则只要满足规则都可以作为锁的类型,类似于 GetEnumerable
/GetAwaiter
那样
我们再来看下使用 System.Threading.Lock
类型之后还是不是 Monitor
原始测试代码
代码语言:javascript代码运行次数:0运行复制var i = 0;
var locker = new Lock();
Parallel.For(1, 100, _ =>
{
lock (locker)
{
i++;
}
});
Cole.WriteLine(i);
反编译之后的结果:
System.Threading.Lock
可以看到,现在的代码里已经没有了 Monitor
,lock 变成了 usings (locker.EnterScope())
再细看实现代码会发现实现是一个自旋,具体可以自己查看源码
.0.0-rc.1.2441.7/src/libraries/System.Private.CoreLib/src/System/Threading/
如果想要使用 System.Threading.Lock
但又还有低版本的框架不支持 System.Threading.Lock
该怎么办呢,github 上有个老哥搞了个 Backport.System.Threading.Lock
library 兼容低版本的,但是测试下来低版本没有性能提升反而有性能损耗,看了下实现和源码的实现并不相同,他是基于 Monitor
封装了一下
我们可以通过 global using alias 来简化例如:global using Lock = System.Object;
或者在项目文件或者 Directory.Build.props
中配置 implicit usings:
<Using Include="System.Object" Alias="Lock" Condition="!$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net9.0'))" />
- .0/
- .0.0-rc.1.2441.7/src/libraries/System.Private.CoreLib/src/System/Threading/
- .Common/pull/212
- .ET 9 Preview 1 中的 Lock 类型
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上一篇:联想BIOS恢复出厂设置详解
下一篇:ThreadLocal
推荐阅读
留言与评论(共有 9 条评论) |
本站网友 宁乡二手房 | 4分钟前 发表 |
现在的代码里已经没有了 Monitor | |
本站网友 吴庆宝 | 10分钟前 发表 |
未来可能会制定一个规则只要满足规则都可以作为锁的类型 | |
本站网友 alexa工具栏 | 7分钟前 发表 |
1000 | |
本站网友 眼神光 | 8分钟前 发表 |
_ => { lock (_lock1) { Interlocked.Increment(ref i); } }); return i; } [Benchmark] public int TraditionalLock() { var i = 0; Parallel.For(1 | |
本站网友 儿童房间装修 | 6分钟前 发表 |
1000 | |
本站网友 日处口读什么的 | 30分钟前 发表 |
C# 1 lock object C# 1 lock objectIntro.ET 9 引入了一个新的 Lock 类型 System.Threading.Lock .ET 9 Preview 1 中的 Lock 类型我们可以使用这一类型代替 lock 的对象来改进锁的性能Sample我们来做一个简单的 benchmark代码语言:javascript代码运行次数:0运行复制[SimpleJob] [MemoryDiagnoser] public class LockObjectBenchmark { private readonly object _lock0 = new(); private readonly Lock _lock1 = new(); [Benchmark(Baseline = true)] public int ewLockObject() { var i = 0; Parallel.For(1 | |
本站网友 研学论坛 | 24分钟前 发表 |
IsTargetFrameworkCompatible('$(TargetFramework)' | |
本站网友 人无千日好花无百日红 | 10分钟前 发表 |
但是测试下来低版本没有性能提升反而有性能损耗 |