文档章节

JVM之锁与并发

扬花落尽丶
 扬花落尽丶
发布于 2017/08/29 00:17
字数 1026
阅读 76
收藏 3

精选30+云产品,助力企业轻松上云!>>>

什么是锁:

  锁是多线程软件开发的必要工具之一,它的基本作用是保护临界区资源不会被多个线程同时访问收到破坏,由于多个线程访问造成对象的数据不一致,那么系统运行将会得到错误的结果。通过锁,可以让多个线程排队,一个一个进入临界区访问目标对象,使目标对象的状态总是保持一致,这就是锁存在的价值。  

对象头和锁:

   每个对象都有一个对象头,用于保护对象的系统信息。对象头中有一个成为Mark Word的部分,它是实现锁的关键。Mark Word在32位系统为一个32位的数据,64位系统为一个64位的数据。用来存放对象的哈希值、对象年龄、锁的指针等信息。

 32位系统距离Mark Word

   Mark Word中前25bit表示对象的哈希值,4位比特表示对象的年龄,1位比特表示是否为偏向锁,2位表示锁的信息。

  是否为偏向锁 锁的信息
无锁状态 0 01
偏向锁 1 01
轻量级锁 0 00
重量级锁 0 10

轻量级锁和重量级锁可以从Mark Word的后两位看出,然而无锁状态和偏量锁需要根据倒数第三个数据进行判断。

  •  偏向锁:

偏向锁是JDK1.6提出的一种锁优化方式。其核心思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作。也就是说,若某一锁被线程获取后,便进入偏向锁模式,当线程再次请求的时候进行了锁请求,则锁退出偏向模式。在JVM中使用-XX:+UseBiasedLocking可以设置启动偏向锁。

  (当使用代码测试时,需要使用参数-XX:BiasedLockingStartupDelay表示虚拟机在启动后,立即启动偏向锁。如果不设置参数,虚拟机会默认在启动4秒后,才启动偏向锁)

应用场景:偏向锁在少量竞争的情况下,对系统性能有一定的帮助。但是在锁竞争激烈的场合下没有太强的优化效果,因为大量的竞争会导致持有锁的线程不停的切换,锁也很难保持在偏向模式。此时,使用锁偏向不仅得不到性能的优化,反而有可能降低系统的性能。因此,在激烈竞争的场合,可以尝试使用-XX:-UseBiasedLocking参数禁用偏向锁。

  • 轻量级锁:

如果偏向锁失败,Java虚拟机会让线程申请轻量级锁。轻量级锁在虚拟机内部,使用一个称为BasicObjectLock对象在线程栈中,因此该指针必然指向持有该锁的线程空间。当需要判断某一线程是否持有该对象锁时,也只需简单的判断对象头的指针是否在当前线程的栈地址范围内即可。同时,BasicLock对象的displaced_header字段,备份了援对象的Mark Word内容。BasicObjectLock对象的obj字段则指向该对象。

首先,BasicLock通过set_displaced_head()方法备份了援对象的Mark Word。接着,使用CAS操作,尝试BasicLock的地址复制到对象头的Mark Word。如果复制成功,那么加锁成功,否则认为加锁失败,那么轻量级锁就有可能被膨胀为重量级锁。

  • 锁膨胀:

当轻量级失败,虚拟机就会使用重量级锁。

第一步是废弃前面的BasicLock备份的对象头信息。第二步则正式启动重量级锁。启动过程分为两部:首先通过inflate()方法进行锁膨胀,其目的是获得对象的ObjectMonitor;然后使用enter()尝试进入该锁。

在enter方法调用中,线程很可能会在操作系统层面被挂起。如果这样,线程间切换和调度的成本就会比较高。

扬花落尽丶
粉丝 5
博文 38
码字总数 31280
作品 0
朝阳
程序员
私信 提问
加载中
请先登录后再评论。
Java多线程系列目录(共43篇)

Java多线程系列目录(共43篇) 转载 2016年03月30日 10:46:28 627 最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02...

osc_p8zyme9p
2018/02/13
1
0
Java 并发编程源码解析汇总篇

java并发编程,内存模型 java并发编程,volatile内存实现和原理 Java并发编程,并发基础 Java 并发编程,线程池(ThreadPoolExecutor)源码解析 Java并发编程,Executor 框架介绍 Java并发编...

郑加威
2018/12/23
180
0
Java 并发编程源码解析汇总篇

java并发编程,内存模型 java并发编程,volatile内存实现和原理 Java并发编程,并发基础 Java 并发编程,线程池(ThreadPoolExecutor)源码解析 Java并发编程,Executor 框架介绍 Java并发编...

郑加威
2018/12/23
0
0
java全网最强并发系列教程

源码 https://github.com/javanan/Java-concurrency Java并发系列(1)并发编程的优缺点 简介: 一直以来,硬件的发展极其迅速,也有一个很著名的"摩尔定律",可能会奇怪明明讨论的是并发编程...

不想当码农的程序员
01/06
0
0
JDK基础---组合知识疑问

JAVA学习好的博客网站 Java 学习/面试指南 Mac下JVisualVM基本使用 jvisualvm远程监控Tomcat jvisualvm 插件地址: SpringMVC线程安全问题的思考 幂等性控制 Java的内存泄漏 java内存泄漏与内...

spinachgit
2019/04/12
15
0

没有更多内容

加载失败,请刷新页面

加载更多

Hacker News 简讯 2020-07-14

更新时间: 2020-07-14 00:00 I Know What You Download on BitTorrent - (iknowwhatyoudownload.com) 我知道你在BitTorrent上下载了什么 得分:69 | 评论:40 Show HN: Primo – all-in-one I......

FalconChen
54分钟前
103
0
绕过移动端系统限制的 dlopen 库 byOpen

byOpen是一个绕过移动端系统限制的增强版dlfunctions库。 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持)。 Android 7以上dlopen, System.load都是...

shzwork
昨天
21
0
Golang学习系列第二天:变量、常量、数据类型和流程语句

继golang第一天后,今天学习下golang的变量、常量、数据类型和控制流语句。 做过其他编程语言(比如JavaScript,java,python)项目的话,其实很好理解变量、常量、数据类型和控制流。 变量也...

董广明
昨天
36
0
redis系列之——一致性hash算法

一致性hash算法你了解吗?什么时候使用?解决什么问题?redis集群模式使用了一致性hash算法了吗? 数据分片(sharding) 分布式数据存储时,经常要考虑数据分片,避免将大量的数据放在单表或...

诸葛小猿
昨天
15
0
IMDB是否提供API? [关闭] - Does IMDB provide an API? [closed]

问题: I recently found a movie organizer application which fetches its data from the IMDB database . 最近,我发现了一个电影管理器应用程序,该应用程序从IMDB数据库中获取其数据。 ...

fyin1314
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部