首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

52.说一下 synchronized 底层实现原理?_synchronized底层实现

概述 说起多线程同步,一般的方案就是加锁,而在 java 中,提到加锁就想起 juc 包提供的 Lock 接口实现类与默认的关键字 synchronized 。...本文将简单的介绍 synchronized底层实现原理,并且介绍 synchronized 的锁升级机制。...一、synchronized底层实现 synchronized 意为同步,它可以用于修饰静态方法,实例方法,或者一段代码块。 它是一种可重入的对象锁。...由于其底层实现机制,synchronized 的锁又称为监视器锁。...二、synchronized 锁的实现原理 synchronized 是对象锁,在 JDK6 引入锁升级机制后,synchronized 的锁实际上分为了偏向锁、轻量级锁和重量级锁三种,这三者都依赖于对象头中

44810

Synchronized底层原理

本文讲述Synchronized关键字的使用和底层原理,我们使用Synchronized主要是为了保护共享资源在多线程修改的时候,会出现相互覆盖的问题,导致数据错乱。...二.原理 接下来讲解一下Synchronized底层原理,jdk1.6之前,Synchronized锁是用操作系统的Mutex Lock来实现的,每次加锁和解锁操作都需要用户态到内核态的切换,切换代价是十分高的...,导致1.6之前Synchronized称为重量锁;1.6之后使用了各自优化,使得Synchronized锁的性能得到了很大的提升跟reentrantlock是一样的,我们来一起看一下Synchronized...的优化原理吧。...关键字的使用和它的底层实现,怎么进行锁升级以及编译器对它的一些优化,你学会了吗?

34430
您找到你想要的搜索结果了吗?
是的
没有找到

Java锁-synchronized底层原理

显示锁:需要手动释放锁,可以设置是否为公平锁 隐式锁:不需要手动释放锁,非公平锁 Monitor Lock接口实现的锁底层是通过AQS同步队列实现的。用到了unsafe.park()方法。...synchronized 底层有一个monitor监视器,会监控持有锁的对象。...轻量级锁 锁标志位 重量级锁 升级为重量级锁时,线程会有从用户态到内核态的切换,所以说,大量线程抢锁时,性能不是很好,建议使用Lock接口实现的锁。...可以用zookeeper或redis实现。市面上已经有成熟的分布式锁框架。像Redisson,Curator等都很不错。...Lock 与synchronized (1)synchronized不会导致死锁现象发生;而Lock可能造成死锁现象Lock可以让等待。 (2)锁的线程响应中断,而synchronized却不行。

30920

死磕Synchronized底层实现

来源:github.com/farmerjohngit/myblog/issues/12 关于synchronized底层实现,网上有很多文章了。...本系列文章将对HotSpot的synchronized实现进行全面分析,内容包括偏向锁、轻量级锁、重量级锁的加锁、解锁、锁升级流程的原理及源码分析,希望给在研究synchronized路上的同学一些帮助...大概花费了两周的实现看代码(花费了这么久时间有些忏愧,主要是对C++、JVM底层机制、JVM调试以及汇编代码不太熟),将synchronized涉及到的代码基本都看了一遍,其中还包括在JVM中添加日志验证自己的猜想...在JVM底层,对于这两种synchronized语义的实现大致相同,在后文中会选择一种进行详细分析。...因为本文旨在分析synchronized实现原理,因此对于其使用的一些问题就不赘述了,不了解的朋友可以看看这篇文章。

53920

死磕Synchronized底层实现

转自:farmerjohngit 文章链接 https://github.com/farmerjohngit/myblog/issues/12 关于synchronized底层实现,网上有很多文章了。...本系列文章将对HotSpot的synchronized实现进行全面分析,内容包括偏向锁、轻量级锁、重量级锁的加锁、解锁、锁升级流程的原理及源码分析,希望给在研究synchronized路上的同学一些帮助...在JVM底层,对于这两种synchronized语义的实现大致相同,在后文中会选择一种进行详细分析。...因为本文旨在分析synchronized实现原理,因此对于其使用的一些问题就不赘述了,不了解的朋友可以看看这篇文章。...重量级锁 重量级锁是我们常说的传统意义上的锁,其利用操作系统底层的同步机制去实现Java中的线程同步。 重量级锁的状态下,对象的mark word为指向一个堆中monitor对象的指针。

42511

死磕Synchronized底层实现

} } } 其实就是锁方法、锁代码块和锁对象,那他们是怎么实现加锁的呢?...底层实现 这里看实现很简单,我写了一个简单的类,分别有锁方法和锁代码块,我们反编译一下字节码文件,就可以了。...synchronized底层的源码就是引入了ObjectMonitor,这一块大家有兴趣可以看看,反正我上面说的,还有大家经常听到的概念,在这里都能找到源码。...大家说熟悉的锁升级过程,其实就是在源码里面,调用了不同的实现去获取获取锁,失败就调用更高级的实现,最后升级完成。...我们先看看他们的区别: synchronized是关键字,是JVM层面的底层啥都帮我们做了,而Lock是一个接口,是JDK层面的有丰富的API。

46420

synchronized实现原理

){ for(int j=0;j<1000000;j++){ i++; } } synchronized底层语义原理 Java 虚拟机中的同步(Synchronization...同步方法 并不是由 monitorenter 和 monitorexit 指令来实现同步的,而是由方法调用指令读取运行时常量池中方法的 ACC_SYNCHRONIZED 标志来隐式实现的 理解Java对象头与.../wait等方法存在于顶级对象Object中的原因 synchronized代码块底层原理 现在我们重新定义一个synchronized修饰的同步代码块,在代码块中操作共享变量i,如下: public...synchronized方法底层原理 方法级的同步是隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作之中。...注意由于synchronized是基于monitor实现的,因此每次重入,monitor中的计数器仍会加1。

24130

被问到傻傻不懂synchronized底层原理

("==syncBlockCode=="); } } } 代码中包三个方法,分别是synchronized修饰实例方法、synchronized静态方法和synchronized...修饰实例方法、synchronized静态方法与synchronized修饰代码块不一样,synchronized修饰实例方法和synchronized静态方法一样 synchronized修饰代码块:...从反编译的结果来看,方法的同步并没有通过指令monitorenter和monitorexit来完成(理论上其实也可以通过这两条指令来实现)。...JVM就是根据该标示符来实现方法的同步的:当方法被调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,获取成功之后才能执行方法体...其实本质上没有区别,只是方法的同步是一种隐式的方式来实现,无需通过字节码来完成。

32930

深入讲解同步锁synchronized底层原理

一.synchronized加锁加的是哪里? 给当前对象加锁,改变对象头信息,由于synchronized底层做了优化加锁过程,不会立即变成重量锁,而是从偏向锁慢慢膨胀轻量锁,再到重量锁。...重量锁就是synchronized是一个指令,解析成monitener,然后jvm去执行。...每个java对象都包含有一个monitor监视器(synchronized锁便是通过这种方式获取锁)。...但是,synchronized修饰的方法并没有monitorenter和monitorexit指令,取而代之的是“ACC_synchronized”标识,该标识指明该方法为同步方法,JVM通过这个标识来识别...二.synchronized加锁改变对象什么东西? synchronized是一个指令,解析成monitener,然后JVM去执行 改变对象头信息。

19020

synchronized 实现原理

前面 3 篇文章讲了 「synchronized」 的同步方法和同步代码块两种用法,还有锁实例对象和锁 Class 对象两种锁机制。今天我们来看看同步方法和同步代码块的实现原理。...「同步方法」的实现是在方法标识 flags 中加了 ACC_SYNCHRONIZED 标识,是一种隐式实现,具体是 JVM 在执行方法的时候,检查是否有 ACC_SYNCHRONIZED 同步标识,有的话会等待获取监控器...* 从栈顶取出 Class 对象 */ 4: monitorenter /** 获取 Class 对象的 monitor 锁 */ 今天从 Java 的汇编代码来分析同步方法和同步代码块的底层实现...,其实这块还不算是真正的底层实现,只是站在 Java 层面上来说,这已经是最底层了。...悄悄打个预防针,接下来的文章会有些晦涩难懂,但是我觉得很有必要弄懂它,弄懂了最底层原理,那么多线程就不怕了,弄懂了,后面会给大家讲的 AQS 就很容易懂,它是把 JVM 底层实现搬到 Java 源库。

42220

synchronized底层是怎么实现的?

前言 面试的时候有被问到,synchronized底层是怎么实现的,回答的比较浅,面试官也不是太满意,所以觉得要好好总结一下,啃啃这个硬骨头。...,正常情况下会用了就可以了,能在实际场景中使用的时候知道锁住的范围就可以了,但是面试的时候可是要问原理的,而且在程序出现问题的时候,知道原理也是能快速定位问题的基础。...synchronized原理 我们来看一下synchronized底层是怎么实现的吧。 例如: 下面一段代码,包含一个synchronized代码块和一个synchronized的同步方法。...重量级锁的减重 高效并发是从JDK5升级到JDK6的一项重要的改进项,在JDK6版本上虚拟机开发团队花费了大量的资源去实现各种锁优化技术,来为重量级锁减重。...参考资料:《深入理解Java虚拟机》、死磕synchronized底层实现

51610

死磕synchronized关键字底层原理

这次我们讲一下日常开发中常用的关键字synchronized,想要用得好,底层原理必须要搞明白。...2.1 同步代码块原理 为了看底层实现原理,使用javap -v xxx.class命令进行反编译。 ?...2.3 Monitor 上面经常提到monitor,它内置在每一个对象中,任何一个对象都有一个monitor与之关联,synchronized在JVM里的实现就是基于进入和退出monitor来实现的,底层则是通过成对的...三、synchronized锁的优化 前面讲过JDK1.5之前,synchronized是属于重量级锁,重量级需要依赖于底层操作系统的Mutex Lock实现,然后操作系统需要切换用户态和内核态,这种切换的消耗非常大...总结 学习synchronized关键字的底层原理不是钻牛角尖,其实是从底层原理上知道了synchronized在什么场景使用会有什么样的效果,我们都知道没有最好的技术,只有最适合的技术,所以在学完之后

95310

synchronized底层实现知多少?synchronized加锁还会升级?

加锁synchronized。但是,why?为什么加了synchronized就能保证共享数据一致了呢? 带着这样的疑问,我们来深入底层探究一下synchronized实现原理。...viewer插件 我们来看一下刚才的程序字节码指令: 实际上synchronized实现从字节码层面来看,就是monitorenter和monitorexit指令,这两个就可以实现synchronized...Hotspot实现的JVM在64位机的markword信息: markword信息 锁升级过程 在JDK早期的时候,synchronized底层实现是重量级的,所谓重量级,就是它直接去找操作系统去申请锁...synchronized底层实现 在硬件层面,锁其实是执行了lock cmpxchg xx指令。...重量级锁 重量级锁通过对象内部的监视器(monitor)实现,其中monitor的本质是依赖于底层操作系统的Mutex Lock实现,操作系统实现线程之间的切换需要从用户态到内核态的切换,切换成本非常高

38020

Synchronized实现原理

Synchronized是由JVM实现的一种实现互斥同步的一种方式,如果你查看被Synchronized修饰过的程序块编译后的字节码,会发现,被Synchronized修饰过的程序块,在编译前后被编译器生成了...+1,其实本质上就通过这种方式实现了可重入性。...在Java6之前,Monitor的实现完全依赖底层操作系统的互斥锁来实现,也就是我们刚才在问题二中所阐述的获取/释放锁的逻辑。...现代JDK中还提供了三种不同的Monitor实现,也就是三种不同的锁: 偏向锁(BiasedLocking) 轻量级锁 重量级锁 这三种锁使得JDK得以优化Synchronized的运行,当JVM检测到不同的竞争状况时...,会自动切换到适合的锁实现,这就是锁的升级、降级。

35350

吃透synchronized实现原理

synchronized实现原理 记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized。对于当时的我们来说,synchronized是如此的神奇且强大。...1、实现原理 Java中的每一个对象都可以作为锁,这是synchronized实现同步的基础: 普通同步方法,锁是当前实例对象。 静态同步方法,锁时当前类的Class对象。...工具查看生成的class文件信息分析synchronized实现: 省略部分代码,如下所示: { public com.zero.test.SynchronizedTest(); ........2、synchronize性能优化 我们知道synchronized是重量级锁,效率不怎么滴,同时这个观念也一直存在我们脑海里,不过在JDK 1.6中对synchronize的实现进行了各种优化,使得它显得不是那么重了...2.1.7、重量级锁 重量级锁通过对象内部的监视器(monitor)实现,其中monitor的本质是依赖于底层操作系统的Mutex Lock实现,操作系统实现线程之间的切换需要从用户态到内核态的切换,切换成本非常高

36520
领券