首页
学习
活动
专区
圈层
工具
发布

Synchronized底层原理

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

61430

Synchronized底层原理

Synchronized是Java高频面试题,相关的知识点其实有很多。定义 Synchronized是Java语言的关键字,它保证同一时刻被Synchronized修饰的代码最多只有1个线程执行。...应用场景 synchronized如果加在方法上/对象上,那么,它作用的对象是非静态的,它取得的锁是对象锁; synchronized如果作用的对象是一个静态方法或一个类,它取到的锁是类锁,这个类所有的对象用的是同一把锁...对象加锁实现原理 在Java的设计中,每一个Java对象就带了一把看不见的锁,可以叫做内部锁或者Monitor锁,Synchronized在JVM里的实现是基于进入和退出Monitor对象来实现方法同步和代码块同步的...JDK6以前 Synchronized加锁是通过对象内部的监视器锁来实现的,监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的,操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高...实现步骤 第一步,当有二个线程A、线程B都要开始给变量+1,要进行操作的时候,发现方法上加了Synchronized锁,这时线程调度到A线程执行,A线程就抢先拿到了锁,当前已经获取到锁资源的线程被称为Owner

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

    Java锁-synchronized底层原理

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

    64120

    死磕Synchronized底层实现

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

    79320

    死磕Synchronized底层实现

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

    60611

    死磕Synchronized底层实现

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

    73120

    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。

    58230

    synchronized 实现原理

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

    69220

    Java并发编程之synchronized底层原理

    (Synchronized底层实现-重量级锁) 多线程同时访问临界区: 使用重量级锁 JDK6对Synchronized的优先状态:偏向锁–>轻量级锁–>重量级锁 Monitor被翻译为监视器或者管程...每个Java对象都可以关联一个(操作系统的)Monitor,如果使用synchronized给对象上锁(重量级),该对象头的MarkWord中就被设置为指向Monitor对象的指针 原理解释 当...(仍然是抢占式) 图中 WaitSet 中的Thread-0,Thread-1 是之前获得过锁,但条件不满足进入 WAITING 状态的线程,后面讲wait-notify 时会分析 它加锁就是依赖底层操作系统的...mutex相关指令实现, 所以会造成用户态和内核态之间的切换, 非常耗性能 !...在JDK6的时候, 对synchronized进行了优化, 引入了轻量级锁, 偏向锁, 它们是在JVM的层面上进行加锁逻辑, 就没有了切换的消耗 3、synchronized字节码原理 代码示例 static

    71710

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

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

    55030

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

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

    56920

    synchronized底层是怎么实现的?

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

    83310

    吃透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实现,操作系统实现线程之间的切换需要从用户态到内核态的切换,切换成本非常高

    70420

    Synchronized的实现原理

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

    63850

    基础篇:详解锁原理,volatile+cas、synchronized的底层实现

    底层原理 代码使用synchronized加锁,在编译之后的字节码是怎样的呢 public class Test { public static void main(String[] args)...synchronized修饰方法原理也是类似的。...主要是将大对象拆成小对象,然后对大对象的加锁操作变成对小对象加锁,增加了并行度 5 CAS的底层原理 在volatile int i = 0; i++中,volatile类型的读写是原子同步的,但是i+...从上面的概念可知,ThreadLocal其实并不能保证变量的同步性,只是给每一个线程分配一个变量副本 关注公众号,大家一起交流 参考文章 objectMonitor.cpp[1] Moniter的实现原理...[2] JVM源码分析之Object.wait/notify实现[3] Java对象头与锁[4] LockSupport中park与unpark基本使用与原理[5] Java并发之Condition[6

    1.8K22
    领券