class Program
{
static void Main(string[] args)
{
var count = ;
var taskList = new Task[];
Stopwatch sp = new Stopwatch();
sp.Start(); // 不要意外复制。每个实例都是独立的。
SpinLock _spinLock = new SpinLock();
for (int i = ; i < taskList.Length; i++)
{
taskList[i] = Task.Run(() =>
{
bool _lock = false;
for (int j = ; j < 10_000_000; j++)
{
_spinLock.Enter(ref _lock);
count++;
_spinLock.Exit();
_lock = false;
}
});
} sp.Stop();
Task.WaitAll(taskList);
Console.WriteLine($"完成! 耗时:{sp.ElapsedTicks}");
Console.WriteLine($"结果:{count}");
}
}

微软文档:  https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.spinlock?redirectedfrom=MSDN&view=netframework-4.8#code-snippet-2p%23code-snippet-2

注解

有关如何使用旋转锁定的示例, 请参阅如何:使用旋转锁进行低级别同步

自旋锁可用于叶级锁, 在这种情况Monitor下, 通过使用、大小或由于垃圾回收压力而隐含的对象分配的成本非常高。 旋转锁定有助于避免阻塞;但是, 如果你预计会有大量的阻塞, 则可能由于旋转过多而无法使用自旋锁。 当锁的粒度较大且数值较大 (例如, 链接列表中的每个节点都有一个锁) 以及锁保留时间始终极短时, 旋转可能非常有利。 通常, 在持有自旋锁时, 应避免使用以下任何操作:

  • 堵塞

  • 调用自身可能会阻止的任何内容,

  • 同时保留多个自旋锁,

  • 进行动态调度的调用 (interface 和虚方法),

  • 对任何代码进行静态调度调用, 而不是任何代码, 或

  • 分配内存。

SpinLock仅应在确定这样做后使用才能改善应用程序的性能。 出于性能方面的考虑, 还SpinLock必须注意, 是值类型。 出于此原因, 必须注意不要意外复制SpinLock实例, 因为两个实例 (原始和副本) 将完全独立, 这可能会导致应用程序出现错误的行为。 如果必须传递实例, 则它应按引用而不是按值传递。 SpinLock

不要在只读SpinLock字段中存储实例。

最新文章

  1. 搭建java环境(Eclipse为例)
  2. 重新加载maven项目的依赖项
  3. Layout Support 获取上下bar的长度
  4. resin access.log format配置详解
  5. beyond compare ftp 文件夹同步
  6. bzoj 2281 [Sdoi2011]黑白棋(博弈+组合计数)
  7. html调用applet
  8. 无刷新删除 Ajax,JQuery
  9. 转:尝试用Gearman实现分布式处理(PHP)
  10. CF 13E Holes 【块状链表】
  11. c语言 文件写入和读取
  12. 使用RUBY生成二维码
  13. 如何统计iOS产品不同渠道的下载量?
  14. LeetCode之旅(16)-Climbing Stairs
  15. dedecms中arclist标签做分页以及分页点击模块样式错乱问题
  16. [转]IIS应用程序池经典模式转集成模式解决方案
  17. 17秋 软件工程 团队第五次作业 Alpha Scrum9
  18. MT【77】函数的定义理解
  19. suricate学习笔记1--初步认识(转)
  20. 通用后台管理系统(ExtJS 4.2 + Spring MVC 3.2 + Hibernate)

热门文章

  1. Prometheus基于consul自动发现监控对象 https://www.iloxp.com/archive/11/
  2. Microservices in action: java(spring) and .net
  3. postgre ~模糊查询慢解决方式
  4. android studio 把 ionic 打包时修改应用名称、修改应用图标、修改启动画面,升级打包
  5. Python3基础 str ljust-rjust-center 左、右对齐 居中
  6. ActiveMQ之三--JMS-Spring和ActiveMQ整合的完整实
  7. linux安装Erlang
  8. cJSON笔记
  9. WITH ROLLUP、WITH CUBE、GROUPING语句的应用
  10. 【442】Remote control GUP Linux