任何互斥协议都会产生这样的问题:如果不能获得锁,应该怎么做?对此有两种选择。其一种方案是让其继续进行尝试,这种锁称为自旋锁,对锁的反复测试过程称为旋转或忙等待。在希望锁延迟较短的情形下,选择旋转的方式比较合乎情理。但只有在多处理器中旋转才有实际意义。

TASLock

Code
 1 public class TASLock : ILock
 2 {
 3     private const int WAITING = 0;
 4     private const int EXECUTING = 1;
 5     int state = WAITING;
 6 
 7     public void setLock()
 8     {
 9         while (Interlocked.CompareExchange(ref state, EXECUTING, WAITING) == EXECUTING)
10         {
11 
12         }
13     }
14 
15     public void unlock()
16     {
17         Interlocked.Exchange(ref state, WAITING);
18     }
19 }

TTASLock

Code
 1 public class TTASLock : ILock
 2 {
 3     private const int WAITING = 0;
 4     private const int EXECUTING = 1;
 5     int state = WAITING;
 6 
 7     public void setLock()
 8     {
 9         while (true)
10         {
11             while (state == EXECUTING) { }
12             if (Interlocked.CompareExchange(ref state, EXECUTING, WAITING) == WAITING)
13             {
14                 return;
15             }
16         }
17     }
18 
19     public void unlock()
20     {
21         Interlocked.Exchange(ref state, WAITING);
22     }
23 }

从正确性的角度来看,TASLock和TTASLock算法是等价的:每一个算法都保证了无死锁的互斥。(原书中算法都是Java代码,使用AtomicBoolean类实现,这里修改为C#代码,不知道和原Java代码意图的差别有多大)但在测试中发现TTASLock比TASLock性能要好,并且性能更稳定。(没有用正式测试软件测试,不会用,请高人指点指点,这里只是本人DEBUG N次的感觉)

性能的差距就是在 state == EXECUTING,每个处理器都有一个cache,它是一种高速的小容量存储器,用来存放处理器感兴趣的数据。对内存的访问通常要比对cache的访问多出几个数量级的机器周期。所以cache的性能对于多处理器系统结构的整体性能具有至关重要的影响。当处理器从内存地址中读数据时,首先检查该地址及其所有存储的数据是否已在它的cache中。如果在cache中,那么处理器产生一个cache命中,并可以立即加载这个值。如果不在,则产生一个cache缺失,且必须在内存或另一个处理器的cache中查找这个数据。接着,处理器在总线上广播这个地址,其它的处理器监听总线。如果某个处理器在自己的cache中发现这个地址,则广播该地址及其值来做出响应。如果所有处理器中都没有发现此地址,则以内存中该地址所对应的值来进行响应。

转载于:https://www.cnblogs.com/pennant/archive/2009/10/19/1586210.html

《多处理器编程的艺术》读书笔记(4)--- 自旋锁(1)相关推荐

  1. 并发编程的艺术 读书笔记

    第一章 并发编程的挑战 1. 单核CPU分配运行时间给各个线程,实现多线程执行代码. 举例:看英文书时某个单词不会,先记住看到书的页数和行数,然后去查单词,查完回到看书状态,相当于上下文切换. 2. ...

  2. JAVA并发编程的艺术-读书笔记

    1.并发编程的挑战 多线程并不一定能带来性能提升,相反过多的线程导致线程创建和上下文切换有时会比单线程性能更低 无锁并发编程:根据数据id进行取模,不同的线程处理不同段的数据 死锁:资源互相等待,线程 ...

  3. 《Java并发编程的艺术》笔记

    <Java并发编程的艺术>笔记 第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种 ...

  4. 《Java 并发编程实战》--读书笔记

    Java 并发编程实战 注: 极客时间<Java 并发编程实战>–读书笔记 GitHub:https://github.com/ByrsH/Reading-notes/blob/maste ...

  5. 《Java编程思想》读书笔记 第十三章 字符串

    <Java编程思想>读书笔记 第十三章 字符串 不可变String String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创建一个全新的String对象,以及包含修 ...

  6. 《编程珠玑》 读书笔记

    <编程珠玑> 读书笔记 娄雨禛 PB16060356 准确的问题描述 很多时候,我们总是过度关注了解决问题所用的巧妙算法,而将问题本身的重要性忽视.当我们拿到一个问题时,应当反复研读问题的 ...

  7. 《javascript面向对象编程指南》读书笔记

    <javascript面向对象编程指南>读书笔记 <javascript面向对象编程指南>读书笔记 第一章 面向对象的JavaScript 第二章 基本数据类型与流程控制 变量 ...

  8. 与孩子一起学编程python_与孩子一起学编程(Python读书笔记3)

    第十一章 嵌套与可变循环 Python 3.X里 print()函数默认是自动换行的,所以本章代码会有很多问题,实际上 print()函数里有一个默认参数 end, 默认情况下: end= " ...

  9. 《Java多线程编程核心技术》读书笔记

    为什么80%的码农都做不了架构师?>>>    <Java多线程编程核心技术>读书笔记. ###第一章 Java多线程技能 使用Java多线程两种方式. 继承Thread ...

  10. 《Java编程思想》读书笔记

    前言:三年之前就买了<Java编程思想>这本书,但是到现在为止都还没有好好看过这本书,这次希望能够坚持通读完整本书并整理好自己的读书笔记,上一篇文章是记录的第十七章到第十八章的内容,这一次 ...

最新文章

  1. 异地多活实践与设计思考点归纳
  2. 数据结构之单链表尾插法创建-RearCreate
  3. mysql+永久+关闭提交,MySQL学习【第十一篇存储引擎之事务解释】
  4. 图像处理之中值滤波介绍及C实现
  5. eclipse中图片大小用什么单位_建筑工程行业中各个单位都是什么样的关系?
  6. java default类型_java – 带有限定符@Default的ZZZZ类型的不满意依赖项
  7. 可视化数据展示工具ChatSQL
  8. 同轴全息matlab仿真,HoloSpec2D 二维全息谱的matlab程序,含有频谱校正 276万源代码下载- www.pudn.com...
  9. 深度学习2.0-12.神经网络与全连接层之数据集的加载
  10. 微信小程序 获取php值,微信小程序如何获取javascript里的数据
  11. jenkins内置环境变量
  12. JBOSS AS 性能调整优化
  13. 脏检查 和 缓存清理机制
  14. 微信打开网址后自动调用手机自带默认浏览器或提示选择浏览器打开如何实现
  15. 数字电子技术基础 目录
  16. SpringBoot简明教程
  17. U盘数据丢失后怎样恢复
  18. 数据结构 查找 的思维导图
  19. 黑客测试漏洞被逮捕 白帽的正确姿势是什么
  20. 数据结构/排序/选择排序/简单选择排序

热门文章

  1. gitlab windows安装_gitlab pages之gitlab-runner 安装(windows)
  2. 线性代数同济第六版_线性代数考试内容与课后习题
  3. iOS 进阶之底层原理一OC对象原理alloc做了什么
  4. Xamarin.Forms的相对布局RelativeLayout
  5. C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例
  6. UIPickerView隐藏透明条
  7. pythonsys模块介绍_sys 模块介绍 - Clarkhedi的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. Windows 10 安全移动 MySQL 数据库的存储位置
  9. Nature科学报告:这项研究,有助于截肢患者可以恢复痛觉感知
  10. 他在京东每天做1000万图灵测试