并发编程中的互斥与自旋互斥异同

       在现在多处理器多核模式架构的CPU下,多线程并发编程是系统编程程序员必须要掌握的技能。在数据同步中,用得比较多的就有互斥。
       在早期的系统中,只有互斥,后来增加了自旋互斥,那么这个互斥和自旋互斥有什么区别呢,到底怎么选择二者呢?
       提到互斥,不得不提到线程的上下文切换,线程上下文切换是有代价的,需要进入内核模式,要保存线程的相关数据与状态,以及寄存器数据,程序计数器等内容。
       互斥的实现基础,是基于硬件提供的compare-and-swap 指令,或者类似的指令。其本质是锁住内存地址总线,禁止短时间的中断来实现的。所以互斥的实现是由硬件提供直接基础的,不是纯由系统软件实现。
       基于互斥的实现基础,互斥适合于快速获得和释放的场景。
       现在流行的做法,是把互斥分成两类:阻塞和非阻塞。
       其中,非阻塞的互斥又称为自旋,因为自旋互斥如果没有获取它需要的锁,它会一直不断循环检测,直到取得互斥锁为止,
自旋互斥在运行期间,底层cpu禁止中断,不然会引入死锁。
       阻塞互斥与自旋互斥的区别在于:
       阻塞互斥如果没有获得锁,会进入睡眠状态,从而可能进行上下文切换,代价会大一些。
       自旋互斥如果没有获得锁,会不断循环检测,不会进入上下文切换,直到获得请求的锁,代价小一些,但是可能浪费CPU时间。

中文版,平时开发超实用工具。Java 2 Platform 软件包 java.applet 提供创建 applet 所必需的类和 applet 用来其 applet 上下文通信的类。 java.awt 包含用于创建用户界面和绘制图形图像的所有类。 java.awt.color 提供用于颜色空间的类。 java.awt.datatransfer 提供在应用程序之间和在应用程序内部传输数据的接口和类。 java.awt.dnd Drag 和 Drop 是一种直接操作动作,在许多图形用户界面系统中都会遇到它,它提供了一种机制,能够在两个 GUI 中显示元素逻辑相关的实体之间传输信息。 java.awt.event 提供处理由 AWT 组件所激发的各类事件的接口和类。 java.awt.font 提供字体相关的类和接口。 java.awt.geom 提供用于在二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成呈现无关的图像的类和接口。 java.awt.print 为通用的打印 API 提供类和接口。 java.beans 包含开发 beans 有关的类,即基于 JavaBeansTM 架构的组件。 java.beans.beancontext 提供 bean 上下文有关的类和接口。 java.io 通过数据流、序列化和文件系统提供系统输入和输出。 java.lang 提供利用 Java 编程语言进行程序设计的基础类。 ......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值