前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程(六)—–synchronized

多线程(六)—–synchronized

作者头像
全栈程序员站长
发布2021-04-07 10:09:45
3200
发布2021-04-07 10:09:45
举报
文章被收录于专栏:全栈程序员必看

一.synchronized的基本语法

synchronized有三种方式来加锁,分别是: 1.修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 2.修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 3.修饰代码块,指定加锁对象,对给定的对象加锁,进入同步代码块前要获得给定对象的锁 不同的修饰类型,代表锁的控制粒度

二.synchronized 锁是如何存储的

1.要实现多线程的互斥特性,那么这把锁需要哪些因素?

1)锁需要有一个东西来表示,比如获得锁是什么状态,无锁状态是什么状态 2)这个状态需要对多个线程共享

2.synchronized 锁是如何存储的

synchronized(lock)是基于lock 这个对象的生命周期来控制锁粒度的,所以可以想到锁的存储和这个lock对象有关系,于是我们以对象在jvm内存中是如何存储作为切入点,去看看对象里面有什么特性能够实现锁

3.对象在内存中的布局

在 Hotspot 虚拟机( Hotspot 虚拟机是jvm虚拟机的一种实现,jvm是一种标准)中,对象在内存中的存储布局,可以分为三个区域:对象头(Header)、实例数据(Instance Data)、对齐填充(Padding) 当我们在 Java 代码中,使用 new 创建一个对象实例的时候,(hotspot 虚拟机)JVM 层面实际上会创建一个instanceOopDesc 对象。Hotspot 虚拟机采用 OOP-Klass 模型来描述 Java 对象实例,OOP(Ordinary Object Point)指的是普通对象指针,Klass 用来描述对象实例的具体类型。Hotspot 采用instanceOopDesc 和 arrayOopDesc 来 描述对象头, instanceOopDesc是继承自oopDesc,在普通实例对象中,oopDesc的定义包含两个成员,分别是_mark和_metadata,_mark 表示对象标记、属于 markOop 类型,也就是接下来 要讲的 Mark World,它记录了对象和锁有关的信息_metadata 表示类元信息,类元信息存储的是对象指向它的类元数据(Klass)的首地址,其中 Klass 表示普通指针、_compressed_klass 表示压缩类指针

4.MarkWord

在 Hotspot 中,markOop 的定义在 markOop.hpp 文件中,Mark word 记录了对象和锁有关的信息,当某个对象被synchronized 关键字当成同步锁时,那么围绕这个锁的一系列操作都和 Mark word 有关系

5.为什么任何对象都可以实现锁

  1. 首先,Java 中的每个对象都派生自 Object 类,而每个Java Object 在 JVM 内部都有一个 native 的 C++对象oop/oopDesc 进行对应。
  2. 线程在获取锁的时候,实际上就是获得一个监视器对象(monitor) ,monitor 可以认为是一个同步对象,所有的Java 对象是天生携带 monitor。在 hotspot 源码的markOop.hpp 文件中,可以看到下面这段代码。

多个线程访问同步代码块时,相当于去争抢对象监视器修改对象中的锁标识,上面的代码中ObjectMonitor这个对象和线程争抢锁的逻辑有密切的关系

三.synchronized 锁的升级

在分析 markword 时,提到了偏向锁、轻量级锁、重量级锁。在分析这几种锁的区别时,我们先来思考一个问题使用锁能够实现数据的安全性,但是会带来性能的下降。不使用锁能够基于线程并行提升程序性能,但是却不能保证线程安全性。这两者之间似乎是没有办法达到既能满足性能也能满足安全性的要求。hotspot 虚拟机的作者经过调查发现,大部分情况下,加锁的代码不仅仅不存在多线程竞争,而且总是由同一个线程多次获得。所以基于这样一个概率,是的 synchronized 在JDK1.6 之后做了一些优化,为了减少获得锁和释放锁带来 的性能开销,引入了偏向锁、轻量级锁的概念。因此大家会发现在 synchronized 中,锁存在四种状态分别是:无锁、偏向锁、轻量级锁、重量级锁; 锁的状态根据竞争激烈的程度从低到高不断升级

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年11月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.synchronized的基本语法
  • 二.synchronized 锁是如何存储的
    • 1.要实现多线程的互斥特性,那么这把锁需要哪些因素?
      • 2.synchronized 锁是如何存储的
        • 3.对象在内存中的布局
          • 4.MarkWord
            • 5.为什么任何对象都可以实现锁
            • 三.synchronized 锁的升级
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档