【多线程学习6】synchronized关键字

【多线程学习6】synchronized关键字

一、synchronized关键字是什么?有什么作用?

synchronized关键字是Java线程同步的关键字其可以修饰方法或代码块,并可以保证其修饰的方法代码块在任意时刻只能有一个线程执行

synchronized关键字使用主要有下面3种:

  • 修饰代码块
  • 修饰实例方法
  • 修饰静态方法

其中
synchronized关键字加到static静态方法和synchronized(class)代码块上都是给class类上锁。
synchronized关键字加到实例方法或synchronized(object)上是给对象实例上锁。

1、synchronized修饰代码块(锁指定对象/类)

    private static final Object object1 = new Object();
     public static void deal1() {
        //同步代码,获取对象锁
         synchronized (object1) {
            //需要同步的操作
        }
        
        //同步代码,获取class类锁
        synchronized (practice3.class) {
             //需要同步的操作
        }
    }

2、synchronized修饰实例方法(锁当前对象实例)

给当前对象实例加锁,进入同步代码前要获得当前对象实例的锁

    public synchronized void dealIt() {
        //需要同步的操作
    }

3、synchronized修饰静态方法(锁当前类)

当前类加锁,进入同步代码块前要获得当前class的锁(会作用于类的所有对象实例)。
因为静态成员不属于任何一个实例对象,归整个类所有,不依赖于类的特定实例,所以被类的所有实例共享。

    public synchronized static void dealIt() {
        //需要同步的操作
    }

问题思考1:

被synchronized修饰的静态方法和非静态方法之间调用互斥吗?
答:
不互斥,如果线程A调用的是实例对象所属的类的静态synchronized方法,线程B调用的是实例对象的非静态synchronized方法,是允许的,不会发生互斥现象,因为访问静态synchronized方法占用的锁是当前类的锁,而非静态synchronized方法所占用的锁是当前实例对象的锁

问题思考2:

构造方法可以使用synchronized修饰吗?
答:
构造方法不能使用synchronized关键字修饰
因为构造方法本身就属于线程安全的,不存在同步构造方法一说。

二、synchronized底层原理

1、对于synchronized同步代码块情况

public class synchronized1{
	public void deal() {
		synchronized(synchronized1.class) {
			System.out.println("Hello wys");
		}
	}
}

执行反编译,并查看反编译后的内容
在这里插入图片描述

在这里插入图片描述

说明:先将.java文件编辑为.class字节码文件,然后将.class文件反编译查看其反编译后的内容,反编译后的内容如下:
在这里插入图片描述
从上面反编译后的内容中我们可以看到:synchronized同步语句块是通过使用 monitorentermonitorexit两个指令。其中monitorenter指令指向同步代码块的开始位置monitorexit指令则指向同步代码块的结束位置

在执行monitorenter时,当前线程会尝试获取锁对象的monitor的持有权(对象监视器monitor),当monitor里的计数器为0就可以获取,并将计数器加1。如果当前线程获取锁失败,那当前线程就要阻塞等待,直到锁被另一个线程释放为止。

在执行monitorexit指令后,将锁计数器设为0,表示锁被释放,其他线程可以尝试获取锁。(注意:当前线程拥有锁对象才能执行monitorexit指令)

2、synchronized修饰方法的情况

public class synchronized1{
	public synchronized void deal1() {
			System.out.println("Hello wys");
	}
}

在这里插入图片描述
我们从反编译的结果可以看到,synchronized修饰方法并没有monitorenter指令和monitorexit指令,取而代之使用的是ACC_SYNCHRONIZED标识。该标识指明此方法为一个同步方法。JVM通过该标识ACC_SYNCHRONIZED标识来辨别一个方法是否为同步方法,从而进行相应的同步调用。

如果是实例方法,JVM会尝试获取实例对象的锁,如果是静态方法JVM会尝试获取当前class的锁。

总结:

  • 1、synchronized同步代码块底层实现是通过monitorentermonitorexit指令,其中monitorenter指令指向同步代码块的开始位置,monitorexit指令则指明同步代码块的结束位置。
  • 2、synchronized修饰方法并没有monitorenter和monitorexit指令,取而代之的是ACC_SYNCHRONIZED标识,该标识指明了该方法是一个同步方法。
  • 不过两者的本质都是对对象监视器monitor的获取。

三、synchronized和volatile有什么区别?

synchronized关键字 和 volatile关键字 两者是互补存在的而不是对立存在的

  • volatile关键字是线程同步的轻量级实现。volatile关键字可以保证变量的可见性,但是不能保证对变量操作的原子性。而synchronized关键字两者都能保证
  • volatile关键字只能修饰变量,而synchronized关键字可以修饰方法和代码块
  • volatile主要是用于解决多线程环境下变量的可见性,而synchronized主要是用于解决多线程环境下访问资源的同步性

四、JDK1.6之后synchronized底层做了哪些优化?

JDK1.6对锁的实现引入了大量的优化,如如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。

加入偏向锁和轻量锁后,锁就有四种状态级别由低到高:无锁-》偏向锁-》轻量级锁-》重量级锁。

具体详细优化内容后续文章介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/61339.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

K8s集群安全机制

1.访问K8s集群的时候,需要经过三个步骤完成具体操作 (1)认证(2)鉴权(授权)(3)准入控制 进行访问的时候,过程中都要经过apiserver,apiserver做统…

java,python,c++有什么区别,python java c c++区别

大家好,给大家分享一下java,python,c有什么区别,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 从这四种语言的难度、受欢迎度还有作用以及优点缺点给楼主做一个全面的分析,我们可以从中了解其区别,以及…

AP2400 LED汽车摩灯照明电源驱动 过EMC DC-DC降压恒流IC

产品特点 宽输入电压范围:5V~100V 可设定电流范围:10mA~6000mA 固定工作频率:150KHZ 内置抖频电路,降低对其他设备的 EMI干扰 平均电流模式采样,恒流精度更高 0-100%占空比控制&#xff0…

【状态估计】基于UKF法、AUKF法的电力系统三相状态估计研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

并查集练习—省份数量

上一篇中讲了并查集及其原理,在这篇文章中简单应用一下。如果对并查集不是很了解强烈建议先看上一篇。 题目: 有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相…

大数据Flink(五十七):Yarn集群环境(生产推荐)

文章目录 Yarn集群环境(生产推荐) 一、准备工作

目标检测中的IOU

IOU 什么是IOU?IOU应用场景写代码调试什么是IOU? 简单来说IOU就是用来度量目标检测中预测框与真实框的重叠程度。在图像分类中,有一个明确的指标准确率来衡量模型分类模型的好坏。其公式为: 这个公式显然不适合在在目标检测中使用。我们知道目标检测中都是用一个矩形框住…

【福建事业单位-推理判断】02图形推理(数量-空间重构)

【福建事业单位-推理判断】02图形推理(数量-空间重构) 一、数量规律1.1点(交点、切点)点的细化考法总结 1.2线条(线条的数量)线的细化考点一笔画(重点)一笔画的判定 总结 1.3 面面的…

flutter开发实战-video_player视频播放功能及视频缓存

flutter开发实战-video_player视频播放功能及视频缓存 最近开发过程中video_player播放视频, 一、引入video_player 在pubspec.yaml引入video_player video_player: ^2.7.0在iOS上,video_player使用的是AVPlayer进行播放。 在Android上,…

医疗实施-集成平台下门诊就诊流程详解

目录 集成平台下门诊就诊流程详解1.患者建档2. 门诊挂号3. 医生就诊4.处方开立5.费用收取、6、科室执行医嘱集成平台下门诊就诊流程详解 这篇文章是考虑医院使用了集成平台之后,门诊就诊流程详解。与我的文章《医疗实施-门诊就诊流程详解》的大致一样,供学有余力的人阅读。 …

AMASS database

AMASS是一个由不同的光学标记运动捕捉数据集统一表示在一个公共框架和参数化下的大型人体运动数据库。它包含了超过40小时的运动数据,涵盖了300多个主体和11000多个运动。它使用了SMPL人体模型,它是一种基于混合形状和姿态空间的生成式人体模型&#xff…

spring boot中web容器配置

web容器配置 spring boot 默认的web容器是 tomcat&#xff0c;如果需要换成其他的 web 容器&#xff0c;可以如下配置。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 默…

springboot()—— swagger

零、一张图读懂swagger 懂了&#xff0c;这玩意就是用swagger搞出来的&#xff01; 就是一个后端开发自测的东西嘛&#xff01; 一、概念 存在即合理&#xff0c;我们看一下swagger诞生的原因&#xff1a;在前后端分离的架构中&#xff0c;前端新增一个字段&#xff0c;后端就…

Git rebase和merge区别详解

文章目录 变基的基础用法变基过程中的冲突解决冲突后无法push问题更新变基后的代码更有趣的变基用法变基的风险用变基解决变基变基 vs 合并 此文在阅读前需要有一定的git命令基础&#xff0c;若基础尚未掌握&#xff0c;建议先阅读这篇文章Git命令播报详版 在 Git 中整合来自不…

iOS 后台运行

iOS后台行&#xff0c;一般有两种方式&#xff1a; 1.UIBackgroundTaskIdentifier后台任务标记时, 2.设置后台运行模式&#xff0c;需要有voip&#xff0c;location功能的才行。不然app上线审核肯定是过不了的。 下面是我学习后台运行的尝试过程。 一.首先创建一个项目功程…

redis缓存雪崩和缓存击穿

目录 缓存雪崩 解决方案&#xff1a; 缓存击穿 ​解决方案 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机&#xff0c;导致大量请求到达数据库&#xff0c;带来巨大压力。 解决方案&#xff1a; u 给不同的 Key 的 TTL 添加随机值 u 利用 Redis …

【力扣】23. 合并 K 个升序链表 <链表指针、堆排序、分治>

目录 【力扣】23. 合并 K 个升序链表题解方法一&#xff1a;暴力&#xff0c;先遍历取出来值到数组中排序&#xff0c;再生成新链表方法二&#xff1a;基础堆排序&#xff08;使用优先队列 PriorityQueue&#xff09;方法三&#xff1a;基础堆排序&#xff08;使用优先队列 Pri…

【深度学习笔记】深度学习框架

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记&#xff0c;视频由网易云课堂与 deeplearning.ai 联合出品&#xff0c;主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习&#xff0c;视频的链接如下&#xff1a; 神经网络和…

【深度学习】采用自动编码器生成新图像

一、说明 你知道什么会很酷吗&#xff1f;如果我们不需要所有这些标记的数据来训练 我们的模型。我的意思是标记和分类数据需要太多的工作。 不幸的是&#xff0c;大多数现有模型从支持向量机到卷积神经网&#xff0c;没有它们&#xff0c;卷积神经网络就无法训练。无监督学习不…

数据集的介绍及其标注

水到绝境是风景 人到绝境是重生 一、什么是目标检测 目标检测是计算机视觉领域的一个重要任务&#xff0c;旨在识别和定位图像或视频中的多个目标对象。与图像分类只关注图像属于哪个类别不同&#xff0c;目标检测不仅要确定目标所属的类别&#xff0c;还要准确地标记目标在图…