synchronized入门到源码

深入浅出synchronized的原理与源码 synchronized 阅读详情

微信公众号 : Java患者

Synchronized

synchronized简介

synchronized是一个java的关键字,是java语言为了解决并发编程中存在的原子性、可见性和有序性的问题,提供了一系列跟并发处理有关的关键字,我们今天要来简单了解一下synchronized。

怎么锁?
package com.zero.day3;

/**
* @Description: synchronized
* @Author: Zero
* @Date: 2019/12/10
*/
public class SynchronizedDemo1 {




    // 同步方法
    public synchronized void wc1 () {
        System.out.println("我在上厕所1");
    }


    // 同步方法 (静态)
    public static void wc2 () {
        synchronized (SynchronizedDemo1.class) {
            System.out.println("我在上厕所2");
        }
    }


    // 同步代码块
    public void wc3 () {
        synchronized (this) {
            System.out.println("我在上厕所3");
        }
    }

}

上面三个简单的方法中都添加了
普通同步方法时:锁是当前实例对象synchronized关键字,也就是在同一时间,每个方法只能被单个线程访问,一个厕所同一时间只有有一个人在用。
静态同步方法时:锁是当前类的class对象(因为静态方法在对象之前运行,运行静态方法的时候可能都没有对象,所以是当前类的class对象)
同步方法块:锁是括号里面的对象

synchronized 实现原理

我们现在对上面的方法进行反编译操作

LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lcom/zero/day3/SynchronizedDemo1; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x21
  public synchronized wc1()V
   L0
    LINENUMBER 15 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "\u6211\u5728\u4e0a\u5395\u62401"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L1
    LINENUMBER 16 L1
    RETURN
   L2
    LOCALVARIABLE this Lcom/zero/day3/SynchronizedDemo1; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x9
  public static wc2()V
    TRYCATCHBLOCK L0 L1 L2 null
    TRYCATCHBLOCK L2 L3 L2 null
   L4
    LINENUMBER 21 L4
    LDC Lcom/zero/day3/SynchronizedDemo1;.class
    DUP
    ASTORE 0
    MONITORENTER
   L0
    LINENUMBER 22 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "\u6211\u5728\u4e0a\u5395\u62402"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L5
    LINENUMBER 23 L5
    ALOAD 0
    MONITOREXIT
   L1
    GOTO L6
   L2
   FRAME FULL [java/lang/Object] [java/lang/Throwable]
    ASTORE 1
    ALOAD 0
    MONITOREXIT
   L3
    ALOAD 1
    ATHROW
   L6
    LINENUMBER 24 L6
   FRAME CHOP 1
    RETURN
    MAXSTACK = 2
    MAXLOCALS = 2

  // access flags 0x1
  public wc3()V
    TRYCATCHBLOCK L0 L1 L2 null
    TRYCATCHBLOCK L2 L3 L2 null
   L4
    LINENUMBER 29 L4
    ALOAD 0
    DUP
    ASTORE 1
    MONITORENTER
   L0
    LINENUMBER 30 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "\u6211\u5728\u4e0a\u5395\u62403"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L5
    LINENUMBER 31 L5
    ALOAD 1
    MONITOREXIT
   L1
    GOTO L6
   L2
   FRAME FULL [com/zero/day3/SynchronizedDemo1 java/lang/Object] [java/lang/Throwable]
    ASTORE 2
    ALOAD 1
    MONITOREXIT
   L3
    ALOAD 2
    ATHROW
   L6
    LINENUMBER 32 L6
   FRAME CHOP 1
    RETURN
   L7
    LOCALVARIABLE this Lcom/zero/day3/SynchronizedDemo1; L4 L7 0
    MAXSTACK = 2
    MAXLOCALS = 3
}

我们仔细找找其实可以找到MONITORENTER跟MONITOREXIT这两个单词,接下来,我就用比较简单粗暴的语言来给大家随便说说这个过程。

    假如这个时候呢有三个线程Thread1,Thread2, Thread3都同时来调

用一个方法,那么代码肯定是共享的啦,那么当这个方法function没有加锁的时候,Thread1来执行这个代码,执行到一半Thread2也可以来执行,Thread3当然也可以执行。
当这个方法function加了锁之后就不一样了,这代码编译就会产生这两个指令,当Thread1来抢到CPU的执行权之后就来执行这个方法了啊,碰到这个MONITORENTER的时候,这就厉害了啊!其他的线程都给调用了wait方法,大家都知道当线程调用了wait方法之后,就会进入等待状态,谁都救不了它们,这个时候Thread1就自己大摇大摆地执行完了这个加锁的方法,自然就有了MONITOREXIT指令,这个时候线程还在等待?怎么办,当线程处于wait的时候我们都知道会调用notifyAll方法去唤醒所有的其他线程,这个时候所有的线程就苏醒了继续执行。

结语

小编是一枚Java Coder,业余写文章,现主营微信公众号《Java患者》,喜欢的话关注我的公众号或者加我微信我们一起学习Java
在这里插入图片描述

深入Java多线程之synchronized方法锁:源码解析与实战应用 本文对Java多线程中的synchronized修饰方法进行了深入解析,包括其原理、源码以及实战应用。通过了解synchronized方法的底层实现机制和工作原理,可以更好地理解其在使用过程中的限制和性能影响,从而更加合理地使用它来确保多线程程序的正确性和性能。 阅读详情

相关推荐

六万字【Java高并发编程入门】第十九篇:并发编程入门总览包教包会【值得收藏】

高并发其实并没有那么难

码农飞哥 3498

Java并发-Synchronized源码解析

可以保证或者在运行时,,同时它还可以。

weixin_49708955的博客 491

synchronized并发讲解源码.zip

我自己的博客所附带的案例源码,我的博客标题名称是"synchronized并发讲解",关注我等待跟多更新

synchronized源码级别详解---Java多线程

本文详细的介绍了synchronized的使用方法及其原理.以及在JDK1.6之后对其进行的大量优化:轻量级锁,偏向锁,自旋等

阿伟のBlog 745

不到200块!手把手教你用ZYNQ7010和AD9363攒一台自己的开源SDR硬件(附BOM清单)

本文详细介绍了如何用不到200元的预算,基于ZYNQ7010 FPGA和AD9363射频芯片打造一台功能完备的开源SDR硬件平台。从核心组件选型、PCB设计到焊接调试,提供全流程实战指南,特别适合预算有限的硬件爱好者和创客群体探索无线通信世界。

weixin_26854829的博客 479

碎碎念android eMMC【转】

本文转载自:https://blog.youkuaiyun.com/Fybon/article/details/44242549 一、/dev/blockroot@:/dev/block #lsbootdevicemmcblk0mmcblk0p1mmcblk0p10…….mmcblk0p18mmcblk0p19mmcblk0p2mmcblk0p20……mmcblk0p29mmcblk0p3mmcblk0p3...

zzb2760715357的博客 376

Java源码分析系列笔记-2.Synchronized

1.Java源码分析系列笔记-1.JMM模型之先谈硬件2.Java源码分析系列笔记-1.JMM模型之再谈JMM3.Java源码分析系列笔记-4.Java源码分析系列笔记-2.锁的优化5.Java源码分析系列笔记-3.volatile6.Java源码分析系列笔记-4.CAS7.Java源码分析系列笔记-5.AQS8.Java源码分析系列笔记-5.手写AQS收起目录。

weixin_37081459的博客 102

中兴OLT配置实战:从零开始,手把手教你完成一个HGU的完整业务开通(含DBA模板、限速与远程升级)

本文详细介绍了中兴OLT配置实战,从零开始手把手教你完成HGU的完整业务开通,包括DBA模板设计、限速与远程升级等关键步骤。通过实际案例和详细命令,帮助工程师快速掌握GPON网络配置技巧,提升运维效率。

weixin_30599769的博客 348

java基础 - synchronized关键字

java基础

软件测试入门笔记 485

innovus:InstPad、CellPad 、module padding、clock cell halo

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。

m0_61544122的博客 2019

2021.07.05【R语言】丨预测lncRNA并绘制venn图

目录摘要环境与方法依赖工具预测工具绘制工具使用命令预测lncRNA统计noncoding_ID绘制Venn图结果展示总结 摘要 接到一个单样品测lncRNA数据的项目,正好拿来练练手,梳理一下lncRNA流程。这里记录预测lncRNA并生成venn图的过程 环境与方法 R version 3.6.3 (2020-02-29) 依赖工具 预测工具 CPC2 CNCI Pfam CPAT 绘制工具 R:VennDiagram 使用命令 预测lncRNA CPC2 #更换env conda activate py

2035

【Java并发】【synchronized】适合初学者体质入门的synchronized

这一篇同样是sychronzied的入门篇,不会涉及底层原理和实现,很适合初学者的学习。好了, 不废话了,让我们马上开始吧🤗是 Java 中的关键字,用于实现线程同步,确保多个线程在访问共享资源时不会发生冲突。它可以修饰方法或代码块,保证同一时间只有一个线程执行被修饰的代码,从而避免数据不一致问题。简单易用只需在方法或代码块上添加关键字即可实现线程同步,无需手动管理锁的获取和释放。自动释放锁当同步代码块执行完毕或发生异常时,锁会自动释放,避免死锁风险。内置锁优化JVM 对。

flzjkl的博客 854

【网络协议】【TSN】精讲TSN工作原理!图解超赞超详细!!!

TSN有一个服务等级(class of service,CoS)的概念。对TSN网络而言,不同优先级的服务对应图3中的PCP码。3位PCP码定义了0(最低)~7(最高)这8个优先级,传输类型分别对应基础、最大努力、卓越努力、严苛应用、延时和抖动小于100 ms的视频、延时和抖动小于10 ms的音频、内部网络控制、网络控制。其会对网络场景进行不同的匹配,是后续调度、配置设计中会考虑到的数据流调度因素。

风云说通信 2627

再见了SpringBoot!高并发的王永远是ReentrantLock + Synchronized!

这段时间,公司拓了一条新业务线,我也在马不停蹄地面试候选人。招聘的职位是高级开发工程师,期望有独当一面的开发能力(也就是阿里的P6),技术面当然是最重要的筛选。话说回来,Java 语言发展...

hnjsjsac的博客 467

ArcGIS Pro 制作这种地图海报

ArcMap 版本与 ArcGIS Pro 版本的制图功能相差太多,无论从美观上还是制图效率都远远优于 ArcMap,用了一段时间的 ArcGIS Pro ,真心推荐有条件的大家赶紧试一试!一个软件也能搞定一张不错的海报哦!----吐槽:好的设计真的是门花时间的活,这个教程大概花了我7小时左右,我都忘了我自己教程中截图多少张了!(可能是我速度太慢了)测试数据:阿里云盘分享-----北极海冰数据.https://www.aliyundrive.com/s/SUhsnqfkmXh。

J_Giser的博客 1427

应用商店评论分析实战:Python逆向工程破解Google Play加密接口与NLP建模

在移动互联网时代,应用商店中的用户评论成为了开发者优化应用、提升用户体验的重要依据。然而,Google Play等应用商店对评论数据进行了加密处理,直接爬取难度较大。本文将介绍如何使用Python逆向工程破解Google Play的加密接口,实现对应用商店评论的实时采集,并结合NLP(自然语言处理)技术进行情感分析和主题建模,为开发者提供有价值的数据支持。

u014481728的博客 1346

再见了SpringBoot!高并发的王永远是ReentrantLock + Synchronized

小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!程序员代码面试指南 IT名企算法与数据结构题目最优解这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。“刷”完本书后,你就是“题王”!

2401_84104809的博客 709

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Alibaba限定发布最新Java并发编程图册(华山版),分享给备战的码农

今天给大家分享一份阿里大佬整理的内部Java并发编程图册 和其他并发编程书籍不一样的是,本文包含大量图文以及源码分析帮助大家理解相关知识,借助这些图文,按照这个顺序学习,至少可以让你简单入门并发。 本书思维导图——理清脉络 知识讲解——循序渐进 抽象问题——图文并茂 实现细节——源码分析 详细内容展示 面试 volatile 关键字,应该具备哪些谈资? 面试 volatile 关键字,应该具备哪些谈资? 如何避免死锁?其实有套路可循

javassb的博客 393

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

这才叫Synchronized的源码分析

文章简介 前面我有文章介绍了synchronized的基本原理,这篇文章我会从jvm源码分析synchronized的实现逻辑,希望让大家有一个更加深度的认识 内容导航 从synchronized的字节码说起 什么是monitor 分析synchronized的源码 01、从synchronized的字节码说起 由于synchronized的实现是在jvm层面,所以我们如果要看它的源码,需要从字节码入手。这段代码演示了synchronized作为实例锁的两种用法,我们

qq_42986622的博客 867

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深入理解synchronized底层源码,小白这篇足够了

深入理解synchronized底层源码 前言 这篇文章从JVM源码分析synchronized的实现逻辑,这样才能更加对synchronized深度的认识。 进程:操作系统资源分配的基本单位。线程:cpu调度的基本单位(真实执行) 阅读导航深入理解synchronized底层源码前言一、synchronized的使用场景二、JVM中,对象在内存中的布局三、synchronized底层从字节码聊起四、monitor到底是什么?五、深入synchronized底层源码六、锁的优化1、偏向锁2、偏向锁的获取

渔夫.AI 2095

synchronized理解

转载地址:https://blog.youkuaiyun.com/javazejian/article/details/72828483 摘取部分方便学习 synchronized的三种应用方式 synchronized关键字最主要有以下3种应用方式,下面分别介绍 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 修饰静态方法,作用于当前类对象加锁,进入同步代码前要...

starchao 7791

从 JVM 源码(HotSpot)看 synchronized 原理

大家好,我是此林。不知道大家有没有这样一种感觉,网上对于一些 Java 框架和类的原理实现众说纷纭,看了总是不明白、不透彻。今天我们就从 HotSpot 源码级别去看 synchronized 的实现原理。全文以的模式来展开讲述,方便大家理解。

2401_82540083的博客 1524

【锁】synchronized(源码c++)

本来是在写面霸系列的,写着写着就写到了这一题:而关于 Synchronized 我去年还专门翻阅 JVM HotSpot 1.8 的源码来研究了一波,那时候我就发现有一个点,一个几乎网上所有文章包括《Java并发编程的艺术》也是这样说的一个点。锁升级想必网上有太多文章说过了,这里提到当轻量级锁 CAS 失败,则当前线程会尝试使用自旋来获取锁。其实起初我也是这样认为的,毕竟都是这样说的,而且也很有道理。因为重量级锁会阻塞线程,所以如果加锁的代码执行的非常快,那么稍微自旋一会儿其他线程就不需要锁了,就可以直接

Abner_G的博客 1819

看图学源码之 synchronized源码解析二: HotSpot 的 源码解析

看图学源码之 synchronized 源码分析二 :HotSpot 源码解析

m0_49867458的博客 1467

synchronized底层源码

一、synchronized的使用场景 synchronized一般使用在下面这几种场景: 修饰代码块,指定一个加锁的对象,给对象加锁 public Demo1{ Object lock=new Object(); public void test1(){ synchronized(lock){ } } } 修饰静态方法,对当前类的Class对象加锁 public class Demo2 { //形式一 public void test1

huapro.vip的程序人生 1246

synchronized源码分析

1.使用方法 synchronized是一种隐式锁 (1)修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 public synchronized void method1(){ System.out.println("Method 1 start"); try { System.out.println("M...

bohenmian的博客 8178
上一篇: 这一行代码到底做了什么?
下一篇: 面试官问我synchronized的底层实现,我差点哭了
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值