Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Synchronized底层原理

Synchronized底层原理

原创
作者头像
用户11220026
发布于 2024-08-03 07:40:34
发布于 2024-08-03 07:40:34
820
举报

Synchronized是Java高频面试题,相关的知识点其实有很多。

定义 Synchronized是Java语言的关键字,它保证同一时刻被Synchronized修饰的代码最多只有1个线程执行。

应用场景 synchronized如果加在方法上/对象上,那么,它作用的对象是非静态的,它取得的锁是对象锁; synchronized如果作用的对象是一个静态方法或一个类,它取到的锁是类锁,这个类所有的对象用的是同一把锁。 每个对象只有一个锁,谁拿到这个锁,谁就可以运行它所控制的那段代码。

对象加锁实现原理 在Java的设计中,每一个Java对象就带了一把看不见的锁,可以叫做内部锁或者Monitor锁,Synchronized在JVM里的实现是基于进入和退出Monitor对象来实现方法同步和代码块同步的。Monitor可以把它理解为一个同步工具,所有的Java对象是天生的Monitor,Monitor监视器对象就是存在于每个Java对象的对象头MarkWord里面,也就是存储指针的指向,Synchronized锁便是通过这种方式获取锁的。

JDK6以前 Synchronized加锁是通过对象内部的监视器锁来实现的,监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的,操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要比较长的时间。

实现步骤 第一步,当有二个线程A、线程B都要开始给变量+1,要进行操作的时候,发现方法上加了Synchronized锁,这时线程调度到A线程执行,A线程就抢先拿到了锁,当前已经获取到锁资源的线程被称为Owner,将MonitorObject中的_owner设置成A线程。

第二步,将mark word设置为Monitor对象地址,锁标志位改为10;

第三步,将B线程阻塞,放到ContentionList队列中。因为JVM每次从Waiting Queue的尾部取出一个线程放到OnDeck中,作为候选者,但是如果并发比较高,WaitingQueue会被大量线程执行CAS操作,为了降低对尾部元素的竞争,将WaitingQueue拆分成ContentionList和EntryList二个队列,所有请求锁的线程首先尝试自旋获取锁,如果获取不到,被放在ContentionList这个竞争队列中,ContentionList中那些有资格成为候选资源的线程被移动到EntryList中。ContentionList、EntryList、WaitSet中的线程都处于阻塞状态,该阻塞是由操作系统来完成的,Linux内核下采用pthread_mutex_lock内核函数实现的。

第四步,作为Owner的A线程执行过程中,可能调用wait释放锁,这个时候A线程进入WaitSet,等待被唤醒。

JDK6版本及以后 Sun程序员发现大部分程序大多数时间都不会发生多个线程同时访问竞态资源的情况,大多数对象的加锁和解锁都是在特定的线程中完成,出现线程竞争锁的情况概率比较低,比例非常高,所以引入了偏向锁和轻量级锁。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java Concurrent synchronized 使用&原理
sychronized 是Java语法层面的同步策略,可以用来修饰instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)。 1、当非static 元素被sychronized修饰时,当前线程都会取得该对象锁,该对象的其他线程均无法访问任何被sychronized修饰的变量或方法。即一个类如果有n个方法被sychronized修饰时,a线程取得对象锁之后,其他线程除a线程正在使用的方法无法使用外,其他需要对象锁的方法均无法使用。即一个对象仅有一个对象锁,一个线程取得后,其他线程都无法获得,其他线程都要阻塞。 2、不同的对象实例的 synchronized方法是不相干扰的。 3、当static 元素被sychronize修饰时,可以防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。 注意:synchronized都是会阻塞线程的,就是说会发生上下文切换,从用户态切换到内核态,所以由sychronized实现对象锁代价较高(新的JDK版本已经优化的较好,但这种方式代价仍然不小),并且使用sychronized涉及对象锁如果在两个以上很容易造成死锁,谨慎使用同步策略,避免无谓的取锁。 很显然sychronized是一种独占锁,也就是悲观锁,默认一定会发生资源争用,所以每次都默认取锁。
邹志全
2019/07/31
6820
多线程进阶——JUC并发编程之Synchronized底层实现概论🔥
Java中提供了两种实现同步的基础语义: synchronized 方法和 synchronized 块 ,先来个案例进行分析!
须臾之余
2021/12/28
2700
多线程进阶——JUC并发编程之Synchronized底层实现概论🔥
Java基础之Synchronized原理
思维导图svg: https://note.youdao.com/ynoteshare1/index.html?id=eb05fdceddd07759b8b82c5b9094021a&type=no
Ryan-Miao
2020/07/01
4720
52.说一下 synchronized 底层实现原理?_synchronized底层实现
说起多线程同步,一般的方案就是加锁,而在 java 中,提到加锁就想起 juc 包提供的 Lock 接口实现类与默认的关键字 synchronized 。我们常听到,juc 下的锁大多基于 AQS,而 AQS 的锁机制基于 CAS,相比起 CAS 使用的自旋锁,Synchronized 是一种重量级的锁实现。
全栈程序员站长
2022/09/23
2.1K1
52.说一下 synchronized 底层实现原理?_synchronized底层实现
Java核心知识点整理大全7-笔记
乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为 别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数 据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新), 如果失败则要重复读-比较-写的操作。 java 中的乐观锁基本都是通过 CAS 操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入 值是否一样,一样则更新,否则失败。
用户10920956
2024/01/18
1380
Java核心知识点整理大全7-笔记
Java锁概论
Java中的锁主要用于保障多并发线程情况下数据的一致性。在多线程编程中为保障数据一致性,我们常需要在使用对象或方法之前加锁。这时若有其他线程也需要使用此对象或該方法,则产生要获得锁。如果某个线程发现锁正被其他线程使用,就会进入阻塞队列等待锁的释放,直到其它线程执行完毕并释放锁,該线程才有机会再次获取锁进行操作。这就保障了在同一时刻只有一个线程持有该对象的锁并修改对象,从而保障数据安全。
Surriento
2024/08/05
780
Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析
synrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。其应用层的语义是可以把任何一个非null对象作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。在HotSpot JVM实现中,锁有个专门的名字:对象监视器。
小勇DW3
2018/08/30
2.1K4
Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析
synchronized—深入总结
传统的锁(也就是下文要说的重量级锁)依赖于系统的同步函数,在linux上使用mutex互斥锁,这些同步函数都涉及到用户态和内核态的切换、进程的上下文切换,成本较高。对于加了synchronized关键字但运行时并没有多线程竞争,或两个线程接近于交替执行的情况,使用传统锁机制无疑效率是会比较低的。
用户5325874
2020/01/16
5940
synchronized—深入总结
Java并发编程之synchronized底层原理
对象头包含两部分:运行时元数据(Mark Word)和类型指针 (Klass Word)
冬天vs不冷
2025/01/21
1240
Java并发编程之synchronized底层原理
Java锁---偏向锁、轻量级锁、自旋锁、重量级锁
之前做过一个测试,反复执行过多次,发现结果是一样的:  1. 单线程下synchronized效率最高(当时感觉它的效率应该是最差才对);  2. AtomicInteger效率最不稳定,不同并发情况下表现不一样:短时间低并发下,效率比synchronized高,有时甚至比LongAdder还高出一点,但是高并发下,性能还不如synchronized,不同情况下性能表现很不稳定;  3. LongAdder性能稳定,在各种并发情况下表现都不错,整体表现最好,短时间的低并发下比AtomicInteger性能差一点,长时间高并发下性能最高(可以让AtomicInteger下台了);
stys35
2020/03/28
2.1K3
synchronized 的使用及实现原理
我们提到,volatile 可以在满足以下两个条件的情况下保证线程安全性: 1. 对变量的写操作不依赖于当前值 2. 该变量没有包含在具有其他变量的不变式中 大部分场景下,我们的并发环境是无法满足这两个条件的,这时就需要使用锁机制了,本篇日志我们就来介绍一下 java 原生的 synchronized 锁是如何实现的以及我们应该如何去使用它。
用户3147702
2022/06/27
1.2K0
synchronized 的使用及实现原理
java并发编程实战(2) 线程同步synchronized
synchronized保证语句块内操作是原子的,所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。被synchronized修饰的类或对象的所有操作都是原子的,因为在执行操作之前必须先获得类或对象的锁,直到执行完才能释放,这中间的过程无法被中断。synchronized和volatile最大的区别就在于原子性,volatile不具备原子性。
黄规速
2022/04/14
4740
java并发编程实战(2) 线程同步synchronized
Synchronized深入分析
Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。
Anymarvel
2020/09/23
6900
Java高并发:synchronize底层原理
每个Java对象都隐含一把锁,Java内置锁的很多重要信息都放在对象头部,对象头有三个字段:
冰寒火
2023/02/23
6880
synchronized
以下内容来自马士兵老师的B站教学视频:https://www.bilibili.com/video/BV1tz411q7c2
hhss
2021/02/12
5190
synchronized
由浅入深逐步了解 Synchronized
synchronized关键字是Java并发编程中线程同步的常用手段之一,其作用有三个:
sowhat1412
2020/12/14
3870
由浅入深逐步了解 Synchronized
synchronized 底层如何实现?什么是锁的升级、降级?
在 Java 6 之前,Monitor 的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作。
葆宁
2019/04/18
3.1K1
synchronized 底层如何实现?什么是锁的升级、降级?
深入了解Synchronized同步锁的优化
在并发编程中,多个线程访问同一个共享资源时,我们必须考虑如何维护数据的原子性。 在JDK1.5之前,Java是依靠Synchronized关键字实现锁功能来做到这点的。Synchronized是JVM实现的一种内置锁,锁的获取和释放是由JVM隐式实现。
用户4283147
2023/08/21
2670
深入了解Synchronized同步锁的优化
Java并发编程:Java中的锁和线程同步机制
乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。Java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。
朝雨忆轻尘
2019/09/25
1K0
Java并发编程:Java中的锁和线程同步机制
深入JVM内置锁 synchronized 底层
上一章节带着大家了解了Java对象头的组成,本节带着大家了解synchronized 关键字的底层原理以及锁的升级过程
janyxe
2022/04/19
4250
深入JVM内置锁 synchronized 底层
推荐阅读
相关推荐
Java Concurrent synchronized 使用&原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档