一、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的实现原理(并发一)的更多相关文章

  1. 深度解析 Vue 响应式原理

    深度解析 Vue 响应式原理 该文章内容节选自团队的开源项目 InterviewMap.项目目前内容包含了 JS.网络.浏览器相关.性能优化.安全.框架.Git.数据结构.算法等内容,无论是基础还是进 ...

  2. java8学习之收集器枚举特性深度解析与并行流原理

    首先先来找出上一次[http://www.cnblogs.com/webor2006/p/8353314.html]在最后举的那个并行流报错的问题,如下: 在来查找出上面异常的原因之前,当然得要一点点 ...

  3. 深度解析HashMap集合底层原理

    目录 前置知识 ==和equals的区别 为什么要重写equals和HashCode 时间复杂度 (不带符号右移) >>> ^异或运算 &(与运算) 位移操作:1<&l ...

  4. 【进阶3-5期】深度解析 new 原理及模拟实现(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://github.com/yygmind/blog/issues/24 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的 ...

  5. 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析

    在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...

  6. 并发编程(十二)—— Java 线程池 实现原理与源码深度解析 之 submit 方法 (二)

    在上一篇<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中提到了线程池ThreadPoolExecutor的原理以及它的execute方法.这篇文章是接着上一篇文章 ...

  7. spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理

    @Configuration注解提供了全新的bean创建方式.最初spring通过xml配置文件初始化bean并完成依赖注入工作.从spring3.0开始,在spring framework模块中提供 ...

  8. Java并发之synchronized关键字深度解析(二)

    前言 本文继续[Java并发之synchronized关键字深度解析(一)]一文而来,着重介绍synchronized几种锁的特性. 一.对象头结构及锁状态标识 synchronized关键字是如何实 ...

  9. Java并发编程:Synchronized及其实现原理

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

随机推荐

  1. CentOS7.4用yum安装并配置MySQL5.7

    1.配置YUM源 下载MySQL源安装包 wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 安装MySQ ...

  2. 悲观并发 乐观并发 Entity Framework Core中的并发处理

    悲观并发策略 A用户发起一个请求   开启了事务 查询到了某一条数据 进行修改     在A提交事务之前 其他人都不能对这条数据进行修改 这种策略最常见的一个问题就是死锁  比如A修改X记录,B修改Y ...

  3. JAVA-重载(overload)和重写(overrite)

    1.重载发生在同一个类中.有多个方法名相同,但是参数列表不同(包括参数个数和参数类型),和返回值无关,权限修饰符也无关. 2.重写(即覆盖)发生在子类和父类中.子类和父类的方法名.参数列表相同:子类的 ...

  4. SVN-Failed to run the WC DB work queue associated with

    解决方法:清空svn的队列 1.下载sqlite3.exe 2.找到你项目的.svn文件,查看是否存在wc.db 3.将sqlite3.exe放到.svn的同级目录 4.启动cmd执行sqlite3 ...

  5. fail to resolve com.umeng.analytics:analytics:latest.integration

    今天友盟接入的时候,他娘的居然提示我这个友盟jar包拉不下来 明明之前还好好的,而且别的什么东西都没问题,就这个有问题 原来使用的是 compile "com.umeng.analytics ...

  6. vue2 inheritAttrs、attrs和attrs和listeners使用

    inheritAttrs.attrs和attrs和listeners使用场景: 组件传值,尤其是祖孙组件有跨度的传值. (1)inheritAttrs 属性说明:https://cn.vuejs.or ...

  7. node-sass模块的安装

    使用淘宝源 npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ npm config set phant ...

  8. K8s的调度策略

    Scuedulor是K8s的调度器 sheduler 是作为单独的程序运行的,启动之后会一直坚挺 API Server,获取 PodSpec.NodeName为空的 pod,对每个 pod 都会创建一 ...

  9. [luogu P2375] [NOI 2014] 动物园

    [luogu P2375] [NOI 2014] 动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向 ...

  10. 2015-11-03 ado.net3

    DataReader和DateSet区别: 1. DataReader是一行一行的读,且只能向前读.DateSet是一次性读取出来放到内存中,所以,DataReader读取速度更快,占用内存更低. 2 ...