文档章节

java并发机制的底层实现原理

getqiu
 getqiu
发布于 2016/12/06 22:05
字数 1123
阅读 21
收藏 1

[TOC]

volatile的应用

volatile定义与实现原理

如果一个字段被申明为volatile,Java线程内存模型确保所有的线程看到这个变量的值是一致的。

具体来讲volatile的两条实现原则:

  • 1.Lock前缀指令会引起处理器缓存回写到内存。

  • 2.一个处理器的缓存回写到内存会导致其它处理器的缓存无效。

synchronized的实现原理与应用

并发编程当中,大多数时候都认为它为重量级锁。但是JDK1.6之后对synchronized进行了各种优化,引入了偏向锁和轻量级锁。

Java对象头

synchronized用的锁是存在Java对象头里的。

|代表状态 |存储内容 |标志位 |

|-------------------|--------------------------------------------|-----------|

|未锁定 |对象hash码,对象分代年龄 |01 |

|轻量级锁定 | 指向锁记录的指针 |00 |

|膨胀(重量级锁定)| 指向重量级锁的指针 |10 |

| GC标记 | 空,不需要记录信息 |11 |

|可偏向 | 偏向线程ID,偏向时间戳,对象年龄|01 |

锁升级与对比

Java6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,锁一共有4中状态:无锁状态,偏向锁,轻量级锁和重量级锁。这4中状态会随着竞争的情况逐渐升级。锁可以升级,但是不能降级。

偏向锁

大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入偏向锁。

偏向锁设置

当一个线程访问同步块并获取锁时,会在对象头栈帧中的锁记录里存储偏向的线程ID。

以后该线程进入和退出同步块时不需要进行CAS操作来加锁和解锁,只需要简单的测试一下对象头的Mark Word里是否存储着指向当前线程的偏向锁。如果测试成功表示线程已经获得锁。

如果测试失败:则需要再测试一下Mark Word中偏向锁的标识是否被设置称为了1(标识当前是偏向锁)

如果没有设置,则使用CAS竞争锁;如果设置了,则尝试使用CAS将对象头的偏向锁指针指向当前线程。

偏向锁的撤销

偏向锁使用了一种等到竞争出现才释放锁的机制。所以当其它线程尝试竞争偏向锁是,持有偏向锁的线程才会释放锁。

偏向锁的撤销,需要等待全局安全点(这个点上没有正在执行的字节码)。

首先暂停拥有偏向锁的线程,然后检查持有偏向锁的线程是否存活,如果线程任然活着,那么这个线程将继续执行,遍历偏向对象的锁记录、栈中的锁记录和对象头Mark Word,要么重新偏向于其它线程,要么恢复到无锁活着标记为不适合作为偏向锁。

关闭偏向锁

偏向锁在Java6以上是默认开启的,但是它在应用程序启动几秒以后才激活,如果必要可以使用JVM参数来关闭延迟:-XX:BiasedLockingStartupDelay=0,如果程序当中的线程通常情况下处于竞争状态,可以通过JVM参数关闭偏向锁-XX:UseBiasedLocking=false

轻量级锁

轻量级锁加锁

线程在执行同步块之前,JVM会首先在当前线程的栈帧中创建用于存储锁记录的空间,并且将对象头中的Mark Word赋值到锁记录中,官方称为Displace Mark Word。然后线程尝试使用CAS将对象头中的MarkWord替换为指向 锁记录的指针。如果成功,当前线程获得锁,如果失败,表示其它线程竞争锁,当前线程变尝试使用自旋来获取锁。

轻量级锁解锁

轻量级锁解锁时,会使用原子操作CAS操作将Displaced Mark Word替换会到对象头,如果成功表示没有竞争发生,如果失败,表示当前存在竞争,锁就会膨胀称为重量级锁。

原子操作的实现原理

原子操作(atomic operation)意思为:不可被中断的一个或一系列操作。

© 著作权归作者所有

共有 人打赏支持
getqiu
粉丝 2
博文 12
码字总数 11145
作品 0
朝阳
程序员
跳槽时,这些Java面试题99%会被问到

我在 Oracle 已经工作了近 7 年,面试过从初级到非常资深的Java工程师,且由于 Java 组工作任务的特点,我非常注重面试者的计算机科学基础和编程语言的理解深度,可以不要求面试者非要精通 ...

Java小铺
08/15
0
0
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1
读书笔记之《Java并发编程的艺术》-并发编程基础

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
8
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
05/06
0
0
Java开发:错过金三银四 你还要错过金九银十吗?面试大纲总结

前言: 一年之计在于春 金三银四已过,2018也已经年过一半多,作为一个开发人员,你是否面上了自己理想的公司,薪资达到心中理想的高度? 面试:如果不准备充分的面试,完全是浪费时间,更是...

Java大蜗牛
08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt那些事0.0.7

在帮助文档(Overview - QML and C++ Integration)中随缘遇到一张图,是关于C++对象与QML整合介绍的,值得标记下来,虽然大部分功能也有所涉猎,但是还是留个记号,万一哪天我失忆了还想写Q...

Ev4n
22分钟前
0
0
快速幂运算

题:求一个数 data 的 n 次幂,要求时间复杂度为log(n) 1:递归算法: /** * x^3=(x^2)*x;x^7=(x^3)^2 * x * * 递归算法 * @param data 底数 * @param n 次...

偶尔诗文
26分钟前
1
0
Google 宣布将会关闭消费者版本 Google+

Google 家的社交平台 Google+ 原来曾经在今年 3 月发生了一次严重的用户资料外泄事故,但这科网巨擘却一直保密,直至今天华尔街日报把事件披露之后才确认事件。Google 在重申问题已经即时解决...

问题终结者
40分钟前
1
0
腾讯三大运维开源项目齐聚“OSCAR开源先锋日”

10月20日,腾讯开源三大运维开源项目——TARS、蓝鲸和织云Metis首次集结,参与了由中国信息通信研究院主办、云计算标准与开源推进委员会承办的 “OSCAR开源先锋日”。会上,腾讯开源团队与前...

腾讯开源
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部