1.重量级锁synchronized。
2.JavaSE1.6为了减少得到锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。
3.synchronized实现同步的基础:Java中每一个对象都可以作为锁。具体表现以下三种形式。
同步方法:锁是当前实例对象。
静态同步方法:锁是当前类的Class对象。
同步代码块:锁是synchronized括号里的配置对象。
4.当一个线程试图访问同步代码块时,他首先必须得到锁,退出或抛出异常时必须释放锁。
5.synchronized在JVM里的实现原理:JVM基于进入和退出Monitor对象实现方法同步和代码同步,但两者实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现的,方法同步使用是使用另外一种方式实现(Java规范没有说明),但是方法同步也可以用这两种指令实现。
monitorenter指令是在编译后插入到同步代码块的开始位置,monitorexit是插入到方法结束处和异常处,JVM保证monitorenter和monitorexit与之配对。任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter
指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。
synchronized用的锁是保存在Java对象头里。如果对象是数组类型,则虚拟机需要用三个字宽存储对象头,如果对象是非数组类型,则用两个字宽存储对象头。在32位虚拟机中,一个字宽等于四个字节,即三十二位。
Java对象头里默认存储对象的hashcode,分代年龄和锁标记位。
make word 的存储结构
可能变化结构,状态变化
64位虚拟机
make Word
Java SE 1.6 为了减少获得锁和释放锁带来的性能消耗,引入了偏向锁,和轻量级锁。
Java SE 1.6 中,锁一共有四种状态,级别从低到高:无锁状态,偏向锁状态,轻量级锁状态, 和重量级锁状态。他们会随着竞争情况逐渐升级,并且锁不会降级,这种升级不能降级的策略目的是为了提高获得锁和释放锁。
当一个线程访问同步块获取锁时,会在对象头和栈帧中的锁记录里存储偏向线程的ID,以后该线程退出和进入代码块时不需要CAS操作来加锁解锁,只需检测make Word是否存着指向当前线程的偏向锁。如果测试成功,说明当前线程已经获取到了锁。 若失败,则检测make word中的偏向锁标识是否为1,如果没有则使用CAS竞争锁,如果设置了,则尝试用CAS将对象头的偏向锁指向当前线程。
1.偏向锁撤销
偏向锁使用了一种竞争才出现释放锁的机制,偏向锁的撤销,会等到全局安全点(在这个时间点没有正在执行的字节码)。它会说先暂定有用偏向锁的线程,然后检测持有偏向锁的线程是否活着,如果线程不处于活动状态,则对象头设置成无锁状态。如果线程仍存活,拥有偏向锁的栈会被执行,遍历偏向对象的锁记录,栈中的锁记录和对象头的Mark Word要么重新偏向于其他线程,要么恢复到无锁或者标记对象不适合作为偏向锁,最后唤醒暂停的线程。
2.关闭偏向锁
JVM 参数 关闭偏向锁延迟(应用程序启动几秒后才激活偏向锁):-XX:BiasedLockingStartupDelay=0,如果你确定应用程序里所有的锁通常情况下处于竞争状态,则可以关闭偏向锁。那么程序默认进入轻量级锁。
关闭偏向锁:-XX:-UseBiasedLocking=false
1. 轻量级锁加锁
线程在执行同步块之前,JVM会先在当前线程的栈桢中创建用于存储锁记录的空间,并
将对象头中的Mark Word复制到锁记录中,官方称为Displaced Mark Word。然后线程尝试使用CAS将对象头中的Mark Word替换为指向锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。
2.轻量级锁解锁
轻量级解锁时,会使用原子的CAS操作将Displaced Mark Word替换回到对象头(锁),如果成功,则表示没有竞争发生。如果失败,表示当前锁存在竞争,锁就会膨胀成重量级锁。
自旋会消耗CPU,为了避免无用的自旋(比如获得锁的线程被阻塞),一旦锁升级成重量级锁,就不会再恢复到轻量级锁状态。当锁处于这个状态下,其他线程试图获取锁时,都会被阻塞,当持有锁的线程释放锁之后会唤醒这些线程,被唤醒的线程就会进行新一轮的夺锁之争。
锁的优缺点对比
你想进去的地方别人已经进去过了------待续
本文发布于:2024-02-01 06:40:23,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170674082534620.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |