文档章节

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

getqiu
 getqiu
发布于 2016/12/06 22:05
字数 1123
阅读 20
收藏 1
点赞 0
评论 0

[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
粉丝 1
博文 12
码字总数 11145
作品 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高级程序员面试大纲——错过了金三,你还要错过银四吗

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己...

Java高级架构
04/27
0
0
Java程序员面试大纲—错过了金三银四,你还要错过2018吗?

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己...

java高级架构牛人
04/27
0
0
读书笔记之《Java并发编程的艺术》-并发编程容器和框架(重要)

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

Hi徐敏
2015/11/11
0
1
Java开发者不会这些永远都只能是三流程序员,细数一下你是不是?

源码系列 手写spring mvc框架 基于Spring JDBC手写ORM框架 实现自己的MyBatis Spring AOP实战之源码分析 Spring IOC高级特性应用分析 ORM框架底层实现原理剖析 手写Spring MVC框架实现 手把手...

美的让人心动
04/16
0
0
面试必看!2018年4月份阿里最新的java程序员面试题目

目录 技术一面(23问) 技术二面(3大块) 性能优化(21点) 项目实战(34块) JAVA方向技术考察点(15点) JAVA开发技术面试中可能问到的问题(17问) 阿里技术面试1 1.Java IO流的层次结构...

美的让人心动
04/16
0
0
再有人问你Java内存模型是什么,就把这篇文章发给他

网上有很多关于Java内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚至有的人说自己更懵了。本文...

java高级架构牛人
07/04
0
0
再有人问你Java内存模型是什么,就把这篇文章发给他。

前几天,发了一篇文章,介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型,是这三个知识点当中最晦涩难懂的...

Java架构
07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

eclipse SVN 项目重新定位

SVN 重新定位 1.方法一 首先:在Eclipse中选择Windows-> Show View->others 就会出现【SVN资源库/SVN Repositories】,选中后,点击确认; 然后:选中原有的地址,选择【重新定位/Relocate】...

qimh
4分钟前
0
0
Linux 第29课 ——Linux集群架构(下)

Linux集群架构(下) 八、DR模式搭建 8.1 准备工作 试验需求三台机器: 分发器,也叫调度器(简写为dir) 192.168.112.136 ying01 rs1 192.168.112.138 ying02 rs2 192.168.112.139 ying03 vip...

feng-01
9分钟前
0
0
轻松搭建svn版本管理工具+svnmanager管理客户端

前面的文章有写过svn版本管理工具的安装是基于svn的安装包进行安装,对于svn与apache的结合还得下svn和apache的模块进行结合过程比较繁琐,今天来介绍下通过centos的yum来安装svn能够快速安装...

javazyw
18分钟前
0
0
keepalived配置高可用集群

Linux集群概述 根据功能划分为两大类:高可用和负载均衡 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务 实现高可用的开源软件有:...

TaoXu
24分钟前
0
0
mysql联表批处理操作

1 概述 mysql中的单表增删改查操作,可以说是基本中的基本. 实际工作中,常常会遇到一些基本用法难以处理的数据操作,譬如遇到主从表甚至多级关联表的情况(如一些历史问题数据的批量处理),考虑到...

社哥
27分钟前
0
0
IntelliJ IDEA 详细图解最常用的配置,适合刚刚用的新人。

刚刚使用IntelliJ IDEA 编辑器的时候,会有很多设置,会方便以后的开发,磨刀不误砍柴工。 比如:设置文件字体大小,代码自动完成提示,版本管理,本地代码历史,自动导入包,修改注释,修改...

kim_o
41分钟前
0
0
Google Java编程风格指南

目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义。当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合...

niithub
44分钟前
0
0
java.net.MalformedURLException异常说明

1.异常片段 Java代码中,在进行URL url = new URL(urllink)操作时,提示以下异常信息,该类异常主要问题出在参数urllink上面。 异常片段1 java.net.MalformedURLException at java.ne...

lqlm
44分钟前
1
0
CentOS7修改mysql5.6字符集

解决办法:CentOS7下修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家所需要的字符集,是国际编码。 具体操作如下: 1.进入MySQL [root@tianqi-01 ~]# mysql -uroot -p Enter passw...

河图再现
45分钟前
0
0
DevExpress v18.1新版亮点——WPF篇(一)

用户界面套包DevExpress v18.1日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容。本文将介绍了DevExpress WPF v18.1 的新功能,快来下载试用新版本!点击下载>> Accordion Co...

Miss_Hello_World
48分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部