Synchronize原理

synchronized原理详解(通俗易懂超级好) 目标 【理解】synchronized底层原理 【掌握】synchronized 的用法 目录目标一、synchronized原理1.1 原子性1.2 可见性1.3 有序性1.4 可重入性二、synchronized 的用法三、synchronized 的底层原理3.1 对象头在JVM中存储的形式3.1.1 对象头3.1.2 对象实例数据3.1.3 对齐填充3.2 Monitor3.3 synchronized锁的优化3.3.1 synchronized锁的状态3.3.2 偏向锁3.3.3. 轻量级锁3. 阅读详情

Synchronize原理

1 普通方法上

2 静态方法上

 

 修饰静态方法内置锁是当前的Class字节码对象

 修饰普通方法内置锁是当前类的实例

 

 

原理与使用:

   从字节码层面解释:

     执行同步代码块

     monitorenter 

     synchronized( ){

 

 

     }

   monitorexit  

 

任何对象都可以作为锁,那么锁信息有存在对象的什么地方呢? 

   存在对象头中

对象头中的信息    Mark Word   Class Metadata Address   ArrayLength

Mark Word 存储的是哈希值 锁信息  空间利用率很高的

 

任何对象都可以作为锁,那么锁信息又存在对象的什么地方呢? 

   存在对象头中

      对象头中的信息: Mark Word             Class MetaData Address    

      

jdk1.6之后 引入了

偏向锁:  每次获取锁和释放锁会浪费资源。很多情况下,竞争者不是由多个线程,而是由一个线程在使用。

                 

  当一个线程进来时候,找对象头查看是否是偏向锁。偏向锁的Mark Word  字段会记录一些信息 :线程id    Epoch  对象分代年龄信息  是否是偏向锁    锁标志位  

  检查锁标志位是否是偏向锁,接着会检查线程的id如果和当前线程id是一致(第一次直接进来)。第二次进来时候 接着运行同步代码块(没有锁的获取和释放)。偏向锁获取时候,没有撤销。等到有竞争时候 才有释放的机制。  场景:只有一个线程访问代码块会大大提高性能。(多个线程会降低性能)

轻量级锁:

    首先栈帧:

      虚拟机栈里面存储的是一个个栈帧,每个方法执行都会存储一个栈帧。每个方法执行都会执行栈帧的进栈出栈。

      复制Mark Word 到虚拟机栈中

      竞争成功之后会将锁的标志位改成轻量级锁,然后执行同步体。  

     其他线程也是复制Mark Word到虚拟机中

      修改Mark Word,发现已经被别的线程获得了锁,所以修改不成功。然后不停的修改。直到第一个线程把锁释放了才OK

      第一个线程执行完毕,第二个获取锁之后,会升级为重量级锁(普遍意义上的synchronize),线程会阻塞。 
      

     轻量级锁用到了自旋概念。好处:多个线程可以同时

     

 

关于单例模式结合Synchronize

      单例模式与线程安全问题

         饿汉式是没有线程安全问题的

         懒汉式是有线程安全问题的

 

    缩小同步代码块的范围,只有在创建时候才有写的操作 其他的都是读的操作没有线程安全问题

     在会出现线程安全问题地方加一个synchronize,锁当前的代码 包裹起来

     这样其实还是有问题的,双重加锁,再来一个验空。

     这样视乎是一个没有问题,重排序问题。

     有可能先执行下面的 在执行上面的这样的重排序问题(没法演示)

     

   

package com.toov5.threadTest;
public class DoubleLock {

    private static volatile DoubleLock doubleLock;   //防止重排序
    
    private DoubleLock(){
        
    }
    public static DoubleLock getInstance(){  //比较饿汉模式而言的,如果在这一行加锁,效率势必会比较低  利用同步代码块
        //自旋while(true)
        if (doubleLock == null){   //判断一下  如果为null时候  这种情况下才会去创建对象
            synchronized (DoubleLock.class){ //静态的用 字节码文件    
                if (doubleLock==null) {  //上锁完了之后 可能没有创建完毕 所以要判断一下  但是 重排序时候 可能会导致 对象可能创建多次
                                         //所以加volitile关键字 (单线程是不会产生重排序问题)
                    doubleLock=new DoubleLock();
                }
            }

        }
        return doubleLock;   //不为空的话 会直接返回呀  多个线程去创建时候 才有有安全塞问题
    }
    
    
    
    public static void main(String[] args) {
         DoubleLock doubleLock1 = DoubleLock.getInstance();
         DoubleLock doubleLock2 = DoubleLock.getInstance();
         System.out.println(doubleLock1==doubleLock2);
    }
    
}

 

DC-DC拓扑:从电感位置一眼识别Buck、Boost与Buck-Boost 本文详细解析了DC-DC拓扑中电感位置对识别Buck、Boost与Buck-Boost电路的关键作用。通过对比不同拓扑的电感连接特征,提供快速识别方法和设计要点,帮助工程师避免常见错误并优化电路性能。特别强调电感位置对输出质量和效率的影响,适合电源设计人员参考。 阅读详情

相关推荐

Python实现高光谱图像生成与增强:从RGB到多光谱转换(附完整代码)

本文分享一个基于Python的实用工具,能够将普通RGB图像转换为模拟高光谱图像,并进一步生成增强的彩色可见图像。为了直观展示图像细节,程序通过对特定波段的组合,生成了一幅增强的 RGB 彩色图像。该函数的主要目标是将一张普通的 RGB 图像转换为包含多个波段的高光谱图像。通过该函数,我们能直观地看到高光谱图像经过波段组合后所得到的彩色图像效果。通过以上代码,我们可以实现对海量图像数据的自动化处理,极大地提升工作效率。已附在文中,欢迎下载测试!通过以上步骤,我们可以生成一幅包含多个光谱波段信息的图像。

m0_74824642的博客 3666

synchronized原理

摘要:Java中的synchronized关键字是实现线程同步的重要机制,具有以下特性:1)作为隐式可重入锁,支持锁升级(偏向锁→轻量级锁→重量级锁);2)保证原子性、可见性和有序性;3)使用方法包括方法加锁和同步代码块。底层原理通过monitor对象实现,JDK1.6后优化了锁机制,引入偏向锁、轻量级锁和自适应自旋锁等策略提升性能。此外,JVM会进行锁粗化和锁消除优化。该机制适用于解决多线程并发问题,但需根据具体场景选择合适的同步策略。

纯洁的小魔鬼 5838

麒麟V10 SP3国产化环境部署MySQL 8.0全流程实战

本文详细介绍了在国产化操作系统麒麟V10 SP3上部署MySQL 8.0的全流程实战指南。从环境准备、冲突排查到安装包处理、服务配置与安全加固,提供了详细的命令和技巧,帮助用户顺利完成MySQL 8.0的部署与优化,适用于国产化环境下的数据库应用。

weixin_29231027的博客 270

Synchronized的底层实现原理(原理解析,面试必备)

synchronize的底层实现原理和monitor的实现机制

weixin_42460087的博客 3万+

手把手教你用Kali+字典爆破WiFi密码:从抓包到破解的完整流程

本文提供了一份详尽的无线网络渗透测试实战指南,重点讲解如何使用Kali Linux和Aircrack-ng套件进行WiFi安全评估。内容涵盖从硬件选型(如RTL8812AU网卡)、驱动配置、监听模式设置,到使用airodump-ng扫描抓包、捕获WPA握手包,以及利用字典进行离线破解的完整流程。同时强调了在授权环境下进行安全测试的重要性,并给出了相应的网络加固建议。

weixin_28568819的博客 1675

一种解决STM32多串口同时收发的方法

在做项目中,遇到了同时调用串口通信时程序崩溃的问题,在项目中,串口1用作调试串口,串口2用作MQTT通信串口,串口3用作下位机通信串口, 串口1重定向以后,用库函数自带的printf函数打印字符串 串口2使用自己写的u2_printf函数,即va_list这套变参宏定义后使用vsprintf函数打印字符串 串口3刚开始使用串口2一样的打印方式,程序在调试调用到串口3打印函数时直接崩溃,后续将串口3改用dma转存输出,仍然无法正常调用 多次研究以后,采用三个串口都使用重定向后的库函数自带的printf

Zxp0605的博客 8796

一篇就够,synchronized原理详解

synchronized详解 在多线程同时访问一个共享变量时,volatile是一个轻量级的解决方案,但是volatile只能修饰一个变量并且不保证原子性。在Java中还提供了两种方式实现同步互斥访问:synchronized和Lock 其实这些本质上就是加锁, 加锁目的:序列化访问临界资源,即同一时刻只能有一个线程访问临界资源(同步互斥访问) 不过有一点需要区别的是:当多个线程执行一个方法时,该方法内部的局部变量并不是临界资源,因为这些局部变量是在每个线程的 私有栈中,因此不具有共享性,不会导致线程安全

小派师兄 1万+

通信算法之283:大疆DJI云哨系统-DJI DroneID物理层协议-解速率匹配及Turbo译码

3. 完整云哨接收机,接收灵敏度。交流: 1279682290 ,2. Turbo译码模块。1. 解速率匹配模块。

leegang12的专栏 868

synchronize原理

本文转自:https://blog.youkuaiyun.com/u011212394/article/details/82228321 一.synchronized的三种应用方式 1.修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 2.修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 3.修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对...

dkingyaoyao的博客 456

YOLOv8性能提升:基于SPD-Conv的高效空间深度转换卷积技术解析【YOLOv8】

SPD-Conv是一种结合了空间和深度信息的卷积技术。与传统卷积不同,SPD-Conv通过在卷积过程中动态调整空间维度和深度维度之间的关系,使得模型能够在较少的参数下捕捉到更多的空间细节。这种方法尤其适用于检测小目标和复杂场景中的细微特征。SPD-Conv的核心思想是通过引入一个空间深度转换矩阵,将输入特征图的空间信息有效地映射到更高维度的深度信息中。这种转换不仅可以保留输入图像的空间细节,还可以在卷积操作中增强特征的表达能力。空间深度转换:通过一个线性变换矩阵,将输入特征图的空间信息转换为深度信息。

博客 1809

Dify平台隐患url:/console/api/remote-files/upload暴露高危漏洞,配置nginx htpasswd模块认证机制屏蔽解决

内部网络探测: 攻击者可通过SSRF扫描内网服务云元数据访问: 可能访问AWS/Aliyun/腾讯云等元数据服务服务端请求伪造: 以服务器身份发起任意HTTP请求。

CN_Eden 1318

synchronize底层原理

synchronize底层原理 简介 synchronize是多个线程争抢同一资源时,在该资源的对象头部加的一把锁。保证多个线程并发访问同一资源时,一个线程访问该资源,不会被其他线程影响。 锁升级 对象加锁对应的markword标识 synchronize加锁是一个锁升级的过程,在高并发状态下,被锁对象先是无锁状态,线程进入后,会在对象头加上该线程标识,下次还是该线程访问直接使用就行,这就是偏向锁(默认偏爱你);如果判断不是该线程,访问线程需要自旋等待(默认自旋10次),这就是自旋锁;自旋10次后还没获得该

weixin_42437852的博客 201

西南科技大学模拟电子技术实验二(二极管特性测试及其应用电路)预习报告

3、用二极管正向虚拟IV仪测出数据,并记录数据于虚表3和虚表4。1、按照指导书multisim仿真软件上画出三种模型电路图,1、按照指导书multisim仿真软件上画出三种模型电路图,1、按照指导书multisim仿真软件上画出三种模型电路图,表6 二极管三种模型参数测试表(电源电压=1.2V)2、用万用表测出数据,并记录数据于虚表1和虚表2。2、用万用表测出数据,并记录数据于虚表5和虚表6。表5 二极管三种模型参数测试表(电源电压=12V)二极管三种模型参数测试表(电源电压=12V)

Welcome To My6n Blog 4081

Synchronize 关键字原理

众所周知 Synchronize 关键字是解决并发问题常用解决方案,有以下三种使用方式: 同步普通方法,锁的是当前对象。 同步静态方法,锁的是当前 Class 对象。 同步块,锁的是 {} 中的对象。 实现原理: JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的。 具体实现是在编译之后在同步方法调用前加入一个 monitor.enter 指令,在退出

crossoverJie专栏 746

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

synchronize底层原理:

synchronize底层原理: Java 虚拟机中的同步(Synchronization)基于进入和退出Monitor对象实现, 无论是显式同步(有明确的 monitorenter 和 monitorexit 指令,即同步代码块)还是隐式同步都是如此。在 Java 语言中,同步用的最多的地方可能是被 synchronized 修饰的同步方法。同步方法 并不是由 monitorenter 和 m...

qq_37997523的博客 293

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

说说synchronize的用法及原理(权威)

摘要:同步锁是多线程编程中确保线程安全的核心机制。文章以Java为例,详细介绍了synchronized的两种使用方式(同步方法和同步代码块),分析了其底层实现原理(监视器锁、JVM优化等)及硬件支持。同时指出了同步锁的性能开销、死锁风险等缺点,并对比了ReentrantLock等替代方案。文章强调,虽然synchronized存在局限性,但在保护共享资源、实现线程安全方面仍是简单有效的选择,深入理解其原理有助于编写高效的并发代码。

Hzx895554135的博客 976

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

synchronize的原理分析

synchronize是平时用的比较多的多线程问题的解决方案,一般说存在多线程问题,加个锁,就用synchronize吧,简单,方便。用lock你还要自己去lock,unlock,没经验的人使用起来没那么溜。今天,就来看看synchronize背后的一些详细知识点,尽量做到广而深。这样的学习才有意思。对于synchronize的学习,我是准备先实践,再分析,再总结。情况1:同一个对象在两个线程中分...

lwgzj的博客 1万+

JVM原理 - Synchronize 内部实现原理(大厂面试题)

在讲 synchronize 原理之前需要先补几个知识点,才能通篇理顺 一、用户态和内核态 在 Linux 中,应用程序稳定性远远比不上操作系统程序,为了保证操作系统的稳定性,Linux 区分了内核空间和用户空间。 内核空间运行操作系统程序和驱动程序,用户空间运行应用程序。 Linux 以这种方式隔离了操作系统程序和应用程序,避免了应用程序影响到操作系统自身的稳定性。这也是 Linux 系统超级稳...

天道酬勤 508

synchronize底层实现原理以及相关的优化

首先来说下synchronize和Lock的区别: 两者都是锁,用来控制并发冲突,区别在于Lock是个接口,提供的功能更加丰富,除了这个外,他们还有如下区别: synchronize自动释放锁,而Lock必须手动释放,并且代码中出现异常会导致unlock代码不执行,所以Lock一般在Finally中释放,而synchronize释放锁是由JVM自动执行的。 Lock有共享锁的概念,所以可以设...

淡定一生2333的博客 3万+

synchronize锁原理,在多线程环境使用集合类

本篇介绍synchronize的相关原理,以及如何在多线程中使用一些常用集合类。

qq_66292058的博客 1044

说说synchronize的用法及原理

根据共享资源范围选择锁对象(实例/类/自定义对象)。

tschen的博客 1622

synchronize的原理

文章目录一级目录二级目录三级目录 1、synchronize的原理 2、谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解 3、static synchronized 方法的多线程访问和作用 4、同一个类里面两个synchronized方法,两个线程同时访问的问题 https://www.cnblogs.com/aspirant/p/11470858.html 一级目录 二级目录 三级目录 ...

Tattoo的博客 1154

synchronize 多线程的基本原理及挑战

一、线程的基本概念 线程是一个进程的组成部分,是一条顺序的执行流。 线程的执行过程会有以下状态: new:新建状态runnable:就绪状态包含 running(运行中) 和 ready(准备状态)waiting/TimedWaiting:等待/超时等待状态blocking:阻塞状态teminated:终止状态 线程运行状态流程图 ...

vnjohn 博主 > 主线分享后端领域业务设计知识、源码思想、架构设计 2173

synchronize的用法及原理

synchronized用于控制多线程对共享资源的访问,可修饰方法或代码块,通过指定锁对象实现互斥。其原理基于对象内部的监视器锁(Monitor),线程进入时获取锁,退出时释放锁,底层依赖操作系统的互斥锁及内存屏障机制保证原子性与可见性。JVM会优化锁状态(偏向锁、轻量级锁等)提升性能。

weixin_46084191的博客 862
上一篇: (补充一)CountDownLatch
下一篇: Redis单线程原理
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值