深度解析synchronized的实现原理(并发一)
一、synchronized实现原理
1、synchronized实现同步的基础:
1)、普通同步方法:锁是当前实例对象
2)、静态同步方法:锁是当前类的class对象
3)、同步方法块:锁是括号里面的对象
2、同步代码块、同步方法示例:
step1:同步代码块:
public class SynchronizedTest {
public synchronized void test1(){ } public void test2(){
synchronized (this){ }
}
}
step2:javap(jdk工具包命令)查看生成的class文件信息分析synchronize的实现
class文件信息如下:
分析:同步代码块是使用monitorenter和monitorexit指令(jvm指令)实现的
同步代码块分析:monitorenter指令插到同步代码块开始的位置
monitorexit指令插到同步代码块结束的位置
每个对象有一个与之相关联的monitor
当且一个monitor被持有之后,对象被锁定
线程执行到monitorenter指令时,获取对象对应的monitor所有权(即获取对象的锁)
同步方法分析:synchronized方法被翻译成普通方法调用+返回指令
无任何指令实现被synchronized修饰的方法
在class文件的方法表中将该方法的access_flags字段中的synchronized字段标志1——》以此付方式表明该方法时同步方法
——》使用调用该方法的对象做为锁对象
二、由上面引出的两个重要概念(实现synchronized的基础)
1、Java对象头
对象头数据结构:
java对象头包含:Mark Word(标记字段)、Kass Pointer(类型指针)
Kass Pointer:
概念:对象指向它的类元数据的指针
作用:虚拟机通过这个指针确定这个对象是哪个类的实例
Mark Word:存储对象运行时的数据,是实现轻量级锁和指向锁的关键
存储数据有:哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳
2、Monitor
Monitor是一个同步工具,同步机制,是一个对象
所有的java对象都有成为Monitor的潜质
java对象有一把看不见的锁(内部锁或者Monitoe锁)
Monitor的数据结构:
Owner:保存拥有该锁的线程唯一标志
EntryQ:关联一个系统的互斥锁,阻塞试图锁住monitor record失败的线程
RcThis:表示阻塞或者等待在该monitor record上的线程个数
Nest:用来实现重入锁的计数
HashCode:保存从对象头拷过来的HashCode值
Candidate:用来避免不必要的阻塞和等待线程唤醒,有0(表示没有需要唤醒的线程)、1(表示要唤醒一个继任线程来竞争锁)
深度解析synchronized的实现原理(并发一)的更多相关文章
- 深度解析 Vue 响应式原理
深度解析 Vue 响应式原理 该文章内容节选自团队的开源项目 InterviewMap.项目目前内容包含了 JS.网络.浏览器相关.性能优化.安全.框架.Git.数据结构.算法等内容,无论是基础还是进 ...
- java8学习之收集器枚举特性深度解析与并行流原理
首先先来找出上一次[http://www.cnblogs.com/webor2006/p/8353314.html]在最后举的那个并行流报错的问题,如下: 在来查找出上面异常的原因之前,当然得要一点点 ...
- 深度解析HashMap集合底层原理
目录 前置知识 ==和equals的区别 为什么要重写equals和HashCode 时间复杂度 (不带符号右移) >>> ^异或运算 &(与运算) 位移操作:1<&l ...
- 【进阶3-5期】深度解析 new 原理及模拟实现(转)
这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/24 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的 ...
- 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析
在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...
- 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)
在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...
- spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理
@Configuration注解提供了全新的bean创建方式.最初spring通过xml配置文件初始化bean并完成依赖注入工作.从spring3.0开始,在spring framework模块中提供 ...
- Java并发之synchronized关键字深度解析(二)
前言 本文继续[Java并发之synchronized关键字深度解析(一)]一文而来,着重介绍synchronized几种锁的特性. 一.对象头结构及锁状态标识 synchronized关键字是如何实 ...
- Java并发编程:Synchronized及其实现原理
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...
随机推荐
- java基础学习之"堆" "栈" "静态存储区" "方法区"
引用部分 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来) Java堆.栈和常量池以及相关String的讲解 等我看完"深入理 ...
- python程序—封装案例
需求: 1.房子有户型.总面积.家具名称列表 房子没有任何家具 2.家具有名字和占地面积,其中 席梦思(bed):4平米 衣柜(chest): 2平米 餐桌(table): 1.5平米 3.将以上3个 ...
- Redhat终端中文乱码解决
文件中的中文以及命令反馈的中文能够正常显示,但是在终端中用ls等命令查看文件时会出现乱码. 我在i18n文件中加了下面两行内容(本来只有第一行),后来就能正常显示了.
- tp引入header文件~
- 集训队日常训练20181201 E 1005 : 小蝌蚪
时间限制(普通/Java):500MS/1500MS 内存限制:65536KByte总提交: 25 测试通过:5 描述 有 n 个装着小蝌蚪的水缸排成一排,你拥有一个无限 ...
- jmeter需要学习的其他点
jmeter知识点访问地址参数化http请求默认值远程连接非GUI运行测试命令jmeter参数设置jmeter常用脚本开发 Beanshell sampleDebug SampleFtp请求java请 ...
- 如何在开发过程中获取客户端的ip呢?
在开发工作中,我们常常需要获取客户端的IP.一般获取客户端的IP地址的方法是:request.getRemoteAddr();但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实 ...
- photoKit使用笔记
@主要用到的类 1PHAssetCollection:图片资源数组(代表着相簿数组) 作用:获取相簿资源数组 示例代码: //获取相簿资源 PHFetchResult<PHAssetCollec ...
- Lab 11-1
Analyze the malware found in Lab11-01.exe. Questions and Short Answers What does the malware drop to ...
- 菜鸡学C语言之寻根溯源
题目描述 Mogg最近翻了翻自己家的族谱,想康康祖先是谁.但是族谱因为年久失修太乱了,他现在只整理出来了一系列父子关系,你能帮他找一找直系亲属中辈分最大的一位吗?(即父亲的父亲的父亲……) 输入 第1 ...