自旋

偏向锁,轻量级锁,自旋锁,重量级锁的详细介绍

守給你的承諾、 提交于 2020-01-04 05:15:49
何为同步?JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现,而方法同步是使用另外一种方式实现的,细节在JVM规范里并没有详细说明,但是方法的同步同样可以使用这两个指令来实现。monitorenter指令是在编译后插入到同步代码块的 开始位置 ,而monitorexit是插入到 方法结束处和异常处 , JVM要保证每个monitorenter必须有对应的monitorexit与之配对。 任何对象 都有一个 monitor 与之关联,当且一个monitor 被持有后,它将处于锁定状态。 线程执行到 monitorenter 指令时,将会尝试获取对象所对应的 monitor 的所有权,即尝试获得对象的锁。 Java对象头 锁存在Java对象头里。如果对象是数组类型,则虚拟机用3个Word(字宽)存储对象头,如果对象是非数组类型,则用2字宽存储对象头。在32位虚拟机中, 一字宽等于四字节,即32bit。 长度 内容 说明 32/64bit Mark Word 存储对象的hashCode或锁信息等 32/64bit Class Metadata Address 存储到对象类型数据的指针 32/64bit Array length 数组的长度(如果当前对象是数组)

volatile、synchronized、lock有什么区别,以及在哪些场景下使用哪种方式?

醉酒当歌 提交于 2020-01-04 05:15:33
[转]JVM锁机制volatile/synchronized/lock 1.volatile实现原理 (1) 聊聊并发(一)——深入分析Volatile的实现原理 --硬件级别锁实现,Lock前缀指令会引起处理器缓存(CPU高级缓存L1/L2/L3)回写到内存。一个处理器的缓存回写到内存会导致其他处理器的缓存无效。 2.JVM锁机制--synchronized (1) 深入JVM锁机制1-synchronized --自旋锁、偏向锁 --synchronized的底层实现主要依靠Lock-Free的队列,基本思路是自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量。 (2) 聊聊并发(二)——Java SE1.6中的Synchronized -- 偏向锁—>轻量锁—>重量锁 比较 偏向锁 Hotspot的作者经过以往的研究发现大多数情况下锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。当一个线程访问同步块并获取锁时,会在对象头和栈帧中的锁记录里存储锁偏向的线程ID,以后该线程在进入和退出同步块时不需要花费CAS操作来加锁和解锁,而只需简单的 测试 一下对象头的Mark Word里是否存储着指向当前线程的偏向锁,如果测试成功,表示线程已经获得了锁,如果测试失败,则需要再测试下Mark Word中偏向锁的标识是否设置成1

linux spin lock 几点注意

独自空忆成欢 提交于 2020-01-04 00:06:33
被自旋锁保护的临界区代码执行时不能睡眠。单核处理器下,获取到锁的线程睡眠,若恰好此时CPU调度的另一个执行线程也需要获取这个锁,则会造成死锁;多核处理器下,若想获取锁的线程在同一个处理器下,同样会造成死锁,若位于另外的处理器,则会长时间占用CPU等待睡眠的线程释放锁,从而浪费CPU资源。 若中断服务程序也要获得锁,则被自旋锁保护的临界区代码执行时不能被其他中断打断。原因同上类似。 被自旋锁保护的临界区代码在执行时,内核不能被抢占,亦同上类似。由自旋锁代码本身处理 来源: CSDN 作者: DADA2ndTIAN 链接: https://blog.csdn.net/zsj1126/article/details/103825089

妖精的绣舞 提交于 2019-12-30 10:33:35
2. 轻量级锁   倘若偏向锁失败, 虚拟机并不会立即升级为重量级锁 ,它还会尝试使用一种称为轻量级锁的优化手段(1.6之后加入的)。轻量级锁不是为了代替重量级锁,它的本意是 在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗,因为使用轻量级锁时,不需要申请互斥量   轻量级锁能够提升程序同步性能的依据是“对于绝大部分锁,在整个同步周期内都是不存在竞争的”,这是一个经验数据。如果没有竞争,轻量级锁使用 CAS 操作避免了使用互斥操作的开销。 但如果存在锁竞争,除了互斥量开销外,还会额外发生CAS操作,因此在有锁竞争的情况下,轻量级锁比传统的重量级锁更慢! 如果锁竞争激烈,那么轻量级将很快膨胀为重量级锁! 当有另外一个线程竞争锁时,由于该锁处于 偏向锁 状态 发现对象头Mark Word中的线程ID不是自己的线程ID,该线程就会执行CAS操作获取锁 如果获取 成功 ,直接替换Mark Word中的线程ID为自己的线程ID,该锁会***保持偏向锁状态*** 如果获取 失败 ,说明当前锁有一定的竞争,将偏向锁 升级 为轻量级锁 线程获取轻量级锁的步骤: 在加锁前,虚拟机需要在当前线程的栈帧中建立 锁记录 (Lock Record)的空间。Lock Record 中包含一个 _displaced_header 属性,用于存储锁对象的 Mark Word 的拷贝。

linux内核(一)linux内核同步,spin_lock与中断以及内核抢占,信号量和互斥锁,屏障,原子操作,BLK大内核锁,读写锁(一)

蹲街弑〆低调 提交于 2019-12-28 08:41:23
注:代码为linux内核版本为2.6.22.6以及4.4.32,不代表其他版本内核的实现方式 spin_lock与spin_lock_irqsave 自旋锁是内核中最常见的锁,也就是线程争用被持有的自旋锁时,并不会睡眠挂起而是在busyloop等待锁重新可用,因此自旋锁更适用于时间短,加锁不睡眠的场景,由于信号量和互斥锁在挂起的时候需要让出cpu执行别的线程,因此涉及到两次上下文切换,当上下文切换带来的开销大于睡眠的开销时,选择自旋锁是更好的选择. 由于信号量会导致睡眠,因此中断处理程序只能使用自旋锁,在中断程序中使用自旋锁时一定要禁止本地中断,也就是当前处理器的中断请求,为了防止中断处理程序争用内核的自旋锁从而自旋,而当前程序必须在中断处理程序执行之后执行,因此中断处理程序会一直自旋下去.也就是双重请求死锁.只需要关闭本地中断,而不需要关心别的处理器的中断处理请求. spin_lock_irqsave的声明,这个函数负责保存中断的当前状态,禁止本地中断,然后获取指定的锁 spin_unlock_irqsave,解锁,并中断恢复到加锁前的状态 #define spin_lock_irqsave(lock, flags) _spin_lock_irqsave(lock, flags) #define _spin_lock_irqsave(lock, flags) __LOCK

乐观锁--CAS

空扰寡人 提交于 2019-12-22 00:54:42
悲观锁与乐观锁的区别 悲观锁会把整个对象加锁占为已有后才去做操作,Java中的Synchronized属于悲观锁。悲观锁有一个明显的缺点就是:它不管数据存不存在竞争都加锁,随着并发量增加,且如果锁的时间比较长,其性能开销将会变得很大。 乐观锁不获取锁直接做操作,然后通过一定检测手段决定是否更新数据,这种方式下,已经没有所谓的锁概念了,每条线程都直接先去执行操作,计算完成后检测是否与其他线程存在共享数据竞争,如果没有则让此操作成功,如果存在共享数据竞争则可能不断地重新执行操作和检测,直到成功为止。 CAS算法 乐观锁的核心算法是CAS(Compareand Swap,比较并交换),它涉及到三个操作数:内存值、预期值、新值,当且仅当预期值和内存值相等时才将内存值修改为新值。这样处理的逻辑是,首先检查某块内存的值是否跟之前我读取时的一样,如不一样则表示期间此内存值已经被别的线程更改过,舍弃本次操作,否则说明期间没有其他线程对此内存值操作,可以把新值设置给此块内存。 假如你足够细心你可能会发现一个疑问,比较和交换,从字面上就有两个操作了,更别说实际CAS可能会有更多的执行指令,他们是原子性的吗?如果非原子性又怎么保证CAS操作期间出现并发带来的问题?我是不是需要用上节提到的互斥锁来保证他的原子性操作?CAS肯定是具有原子性的,不然就谈不上在并发中使用了

自旋锁+信号量

 ̄綄美尐妖づ 提交于 2019-12-20 04:19:30
本文将为你介绍内核同步算法中的自旋锁和信号量。在这之前,先了解一些概念。 执行线程:thread of execution,指任何正在执行的代码实例,可能是一个正在内核线程,一个中断处理程序等。有时候会将执行线程简称为线程。 临界区:critical region,即访问和操作共享数据的代码段。 多个执行线程并发访问同一资源通常是不安全的,通常使用自旋锁和信号量来实现对临界区互斥的访问。 自旋锁 自旋锁(spin lock)是一个对临界资源进行互斥访问的典型手段。自旋锁至多只能被一个执行线程持有。当一个执行线程想要获得一个已被使用的自旋锁时,该线程就会一直进行忙等待直至该锁被释放,就如同“自旋”所表达的意思那样:在原地打转。 我们也可以这么理解自旋锁:它如同一把门锁,而临界区就如同门后面的房间。当一个线程A进入房间后,它会关闭房门,使得其他线程不得进入。此时如果其他某个进程B需要进入房间,那么只能在门外“打转”。当A进程打开们后,进程B才能进入房间。 自旋锁的使用 1.定义初始化自旋锁 使用下面的语句就可以先定一个自旋锁变量,再对其进行初始化: 1 spinlock_t lock; 2 spin_lock_init(&lock); 也可以这样初始化一个自旋锁: 1 spinlock_t lock=SPIN_LOCK_UNLOCKED; 2.获得自旋锁 1 void spin

everspin自旋转矩MRAM技术

送分小仙女□ 提交于 2019-12-20 04:09:42
MRAM的主体结构由三层结构的MTJ构成:自由层(free layer),固定层和氧化层。自由层与固定层的材料分别是CoFeB和MgO。MRAM 是一种非易失性的磁性随机存储器。它拥有静态随机存储器(SRAM)的高速读取写入能力,以及动态随机存储器(DRAM)的高集成度,而且基本上可以无限次地重复写入。存储器读取电路是通过加载相同的电压判断输出电流的大小从而判断存储器的信息。 everspin的最新MRAM技术利用自旋转矩传递特性,即利用极化电流操纵电子的自旋,以建立自由层的所需磁状态,以对存储阵列中的位进行编程或写入。 与Toggle MRAM相比,自旋传递扭矩MRAM或STT-MRAM显着降低了开关能量,并且具有高度可扩展性,从而可以实现更高密度的存储产品。我们的第三代MRAM技术使用垂直MTJ。我们已经开发了具有高垂直磁各向异性的材料和垂直MTJ叠层设计,可提供长数据保留,小单元尺寸,更大密度,高耐久性和低功耗。 1Gb是最新一代的STT-MRAM,利用了ST-DDR4,它是一种类似于JEDEC的DDR4接口,需要进行一些修改才能利用MRAM技术的持久性。 这些产品的性能类似于持久性DRAM,但无需刷新。 来源: CSDN 作者: EVERSPIN 链接: https://blog.csdn.net/EVERSPIN/article/details/103613751

STT-MRAM技术改变现状

巧了我就是萌 提交于 2019-12-19 23:30:27
到目前为止,设计人员可以使用的存储技术是易变的,这意味着在断电后,存储器中的数据内容会丢失。但是,随着Everspin Technologies推出256Mb STT-MRAM,系统现在可以拥有像DRAM这样具有高性能的内存,但可以提供持久的非易失性数据存储。 图1:STT-MRAM STT-MRAM代表自旋转移转矩磁阻随机存取存储器。写入STT-MRAM设备的任何数据本来就是持久的,不需要任何电池或超级电容器。通过写入存储阵列来捕获数据,该存储阵列可利用极化电流控制电子自旋。 STT-MRAM的性能类似于DRAM,但不需要刷新。当前可用的接口是ST-DDR3,它与标准JEDEC DDR3非常相似。将来还将提供ST-DDR4接口,从而带来更高的速度和更大的容量。 STT-MRAM技术的一些优点是: •非易失性数据 •性能特征类似于DRAM 记忆 •十亿次以上的数据耐久性 •DDR3兼容封装和未来的DDR4 兼容的脚印 •ST-DDR3接口和将来的ST-DDR4接口 •字节读写(无块) STT-MRAM是通过自旋电流实现信息写入的一种新型非易失性磁随机存储器,是磁性存储器MRAM 的二代产品。STT-MRAM存储单元的核心仍然是一个MTJ,由两层不同厚度的铁磁层及一层几个纳米厚的非磁性隔离层组成,它是通过自旋电流实现信息写入的 来源: 51CTO 作者: 英尚微电子 链接:

everspin自旋转矩MRAM技术

谁都会走 提交于 2019-12-19 23:27:13
MRAM的主体结构由三层结构的MTJ构成:自由层(free layer),固定层和氧化层。自由层与固定层的材料分别是CoFeB和MgO。MRAM 是一种非易失性的磁性随机存储器。它拥有静态随机存储器(SRAM)的高速读取写入能力,以及动态随机存储器(DRAM)的高集成度,而且基本上可以无限次地重复写入。存储器读取电路是通过加载相同的电压判断输出电流的大小从而判断存储器的信息。 everspin的最新MRAM技术利用自旋转矩传递特性,即利用极化电流操纵电子的自旋,以建立自由层的所需磁状态,以对存储阵列中的位进行编程或写入。 与Toggle MRAM相比,自旋传递扭矩MRAM或STT-MRAM显着降低了开关能量,并且具有高度可扩展性,从而可以实现更高密度的存储产品。我们的第三代MRAM技术使用垂直MTJ。我们已经开发了具有高垂直磁各向异性的材料和垂直MTJ叠层设计,可提供长数据保留,小单元尺寸,更大密度,高耐久性和低功耗。 1Gb是最新一代的STT-MRAM,利用了ST-DDR4,它是一种类似于JEDEC的DDR4接口,需要进行一些修改才能利用MRAM技术的持久性。 这些产品的性能类似于持久性DRAM,但无需刷新。计划开发其他产品,这些产品将利用高速串行接口用于各种嵌入式应用 来源: 51CTO 作者: 英尚微电子 链接: https://blog.51cto.com/14618340