iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解Java Synchronized的实现原理
  • 549
分享到

详解Java Synchronized的实现原理

2024-04-02 19:04:59 549人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录SynchronizedSynchronized的使用方式Synchronized的底层实现1.Java对象头2.Monitor3.线程状态流转在Monitor上体现Synchr

谈到多线程就不得不谈到Synchronized,重要性不言而喻,今天主要谈谈Synchronized的实现原理。

Synchronized

synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized 翻译为中文的意思是同步,也称之为”同步锁“。

synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。

Synchronized的使用方式

主要有3种使用方式:

1.修饰实例方法:作用于当前实例加锁

public synchronized void method(){

        // 代码

}

2.修饰静态方法:作用于当前类对象加锁

public static synchronized void method(){

        // 代码

 }

3.修饰代码块:指定加锁对象,对给定对象加锁

synchronized(this){

  //代码                                  

 }

Synchronized的底层实现

synchronized的底层实现是完全依赖JVM虚拟机的,所以谈synchronized的底层实现,就不得不谈数据在JVM内存的存储:Java对象头,以及Monitor对象监视器。

1.Java对象头

在JVM虚拟机中,对象在内存中的存储布局,可以分为三个区域:

  • 对象头(Header)
  • 实例数据(Instance Data)
  • 对齐填充(Padding)

Java对象头主要包括两部分数据:

1)类型指针(Klass Pointer)

是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例;

2)标记字段(Mark Word)

用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等等,它是实现轻量级锁和偏向锁的关键.

所以,很明显synchronized使用的锁对象是存储在Java对象头里的标记字段里。

2.Monitor

monitor描述为对象监视器,可以类比为一个特殊的房间,这个房间中有一些被保护的数据,monitor保证每次只能有一个线程能进入这个房间进行访问被保护的数据,进入房间即为持有monitor,退出房间即为释放monitor。

上图是syncrhoized同步代码块反编译截图,可以很清楚的看见,主要就是通过锁对象的monitor的取用(monitorenter)与释放来(monitorexit)实现的。

3.线程状态流转在Monitor上体现

当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程:

  • Contention List:所有请求锁的线程将被首先放置到该竞争队列
  • Entry List:Contention List中那些有资格成为候选人的线程被移到Entry List
  • Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set
  • OnDeck:任何时刻最多只能有一个线程正在竞争锁,该线程称为OnDeck
  • Owner:获得锁的线程称为Owner
  • !Owner:释放锁的线程

下图反映了个状态转换关系:

Synchronized 的锁升级

锁解决了数据的安全性,但是同样带来了性能的下降,hotspot 虚拟机的作者经过调查发现,大部分情况下,加锁的代码不仅仅不存在多线程竞争,而且总是由同一个线程多次获得。

所以基于这样一个概率,synchronized 在jdk1.6 之后做了一些优化,为了减少获得锁和释放锁来的性能开销,引入了偏向锁,锁的状态根据竞争激烈的程度从低到高不断升级。

1.无锁

无锁没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。

2.偏向锁

偏向锁是JDK6中引入的一项锁优化,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁。

偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取锁的代价。

3.轻量级锁

是指当锁是偏向锁的时候,被另外的线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,从而提高性能。

4.重量级锁

指的是原始的Synchronized的实现,重量级锁的特点:其他线程试图获取锁时,都会被阻塞,只有持有锁的线程释放锁之后才会唤醒这些线程。

到此这篇关于详解Java Synchronized的实现原理的文章就介绍到这了,更多相关Java Synchronized内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解Java Synchronized的实现原理

本文链接: https://www.lsjlt.com/news/168789.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Java Synchronized的实现原理
    目录SynchronizedSynchronized的使用方式Synchronized的底层实现1.Java对象头2.Monitor3.线程状态流转在Monitor上体现Synchr...
    99+
    2024-04-02
  • java synchronized的用法及原理详解
    目录为什么要用synchronized使用方式字节码语义对象锁(monitor)锁升级过程为什么要用synchronized 相信大家对于这个问题一定都有自己的答案,这里我还是要啰嗦...
    99+
    2024-04-02
  • java synchronized 锁机制原理详解
    目录前言: 1、synchronized 的作用:2、synchronized 底层语义原理:3、 synchronized 的显式同步与隐式同步:3.1、syn...
    99+
    2024-04-02
  • Java并发之synchronized实现原理深入理解
    目录synchronized的三种应用方式synchronized作用于实例方法synchronized作用于静态方法synchronized同步代码块synchronized底层语...
    99+
    2024-04-02
  • java多线程Synchronized实现可见性原理解析
    Synchronized实现可见性原理 可见性 要实现共享变量的可见性,必须保证两点: 线程修改后的共享变量值能够及时从工作内存刷新到主内存中 其他线程能够及时把共...
    99+
    2024-04-02
  • synchronized底层实现原理
    测试类: public class SynchronizedTest {     public void get() {         synchronized (this) { ...
    99+
    2024-04-02
  • Java关键字synchronized原理与锁的状态详解
    目录一、Java中锁的概念二、同步关键字synchronized特性1、锁消除示例2、锁粗化示例三、synchronized关键字原理1、关于Mark Word2、锁的状态变化(1)...
    99+
    2022-11-13
    Java synchronized Java
  • Synchronized的底层实现原理(原理解析,面试必备)
    synchronized 一. synchronized解读 1.1 简单描述 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized 翻译为中文的意思是同步,也称之为同步锁。 synchronize...
    99+
    2023-08-19
    面试 java jvm
  • java并发编程synchronized底层实现原理
    首先那些说看过synchronized源码的基本都是大聪明,synchronized根本点不进去,想弄懂它的实现原理,我们只能通过看编译好的字节码文件 整个测试类 public cl...
    99+
    2024-04-02
  • java的Builder原理和实现详解
    首先给一个简单的Builder设计模式的例子: 主实现类代码如下: public class CompanyClient { public String company...
    99+
    2024-04-02
  • Java synchronized底层实现原理以及锁优化
    目录一、概述synchronized简介synchronized作用synchronized的使用二、实现原理三、理解Java对象头四、JVM对synchronized的锁优化1、偏...
    99+
    2024-04-02
  • Java NIO Buffer实现原理详解
    目录1、Buffer的继承体系2、Buffer的操作API使用案例3、Buffer的基本原理4、allocate方法初始化一个指定容量大小的缓冲区5、slice方法缓冲区分片6、只读...
    99+
    2024-04-02
  • Synchronized的底层实现原理是什么
    Synchronized的底层实现原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。(1)给静态方法加锁public&n...
    99+
    2024-04-02
  • Synchronized 和 ReentrantLock 的实现原理及区别
    目录前言考点分析知识扩展ReentrantLock 源码分析JDK 1.6 锁优化自适应自旋锁锁升级总结前言 在 JDK 1.5 之前共享对象的协调机制只有 synchro...
    99+
    2024-04-02
  • Java CompletableFuture实现原理分析详解
    目录简介CompletableFuture类结构CompletableFuture回调原理CompletableFuture异步原理总结简介 前面的一篇文章你知道Java8并发新特性...
    99+
    2024-04-02
  • Java实现JDK动态代理的原理详解
    目录概念案例静态代理JDK动态代理模式原理分析真相大白概念 代理:为控制A对象,而创建出新B对象,由B对象代替执行A对象所有操作,称之为代理。一个代理体系建立涉及到3个参与角色:真实...
    99+
    2024-04-02
  • synchronized背后的monitor锁实现详解
    目录获取和释放 monitor 锁的时机用 javap 命令查看反汇编的结果同步代码块同步方法获取和释放 monitor 锁的时机 本文我们研究下 synchronized 背后的 ...
    99+
    2024-04-02
  • Java的Synchronized原理与Callable接口实例分析
    这篇“Java的Synchronized原理与Callable接口实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Ja...
    99+
    2023-06-29
  • Java线程的停止实现原理详解
    目录线程停止的原理如何正确停止线程在普通情况下停止线程在阻塞情况下停止线程线程在每次迭代后都阻塞停止线程的最佳实践错误停止的方法被弃用的stop,suspend和resume方法用v...
    99+
    2023-01-28
    Java线程的停止 Java线程原理
  • Java Synchronized锁的使用详解
    目录Synchronized的用法同步示例方法同步静态方法同步代码块Synchronized的用法 在多线程并发问题中,常用Synchronized锁解决问题。Synchronize...
    99+
    2022-11-13
    Java Synchronized锁使用 Java Synchronized锁 Java Synchronized
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作