synchronized实现原理

  synchronized实现同步的基础:java中每个对象都可以作为锁,如下:

  • 对于普通同步方法,锁是当前实例对象
  • 对于静态同步方法,锁是当前类的Class对象
  • 对于同步方法块,锁是synchronized括号里配置的对象

当一个线程试图访问同步代码块时,它首先必须得到锁,退出或者抛出异常时必须释放锁。

从JVM规范中看到,JVM基于进入和退出的Monitor对象来实现方法同步和代码块同步,使用了monitorenter和monitorexit指令实现的。

Java对象头

synchronized用的锁是存在Java对象头里面的。(剩下太细节,我也不想背,放弃),记住里面有个MARK word,里面存放一些hashcode。

锁的状态

锁一共有四种状态:无锁状态,偏向锁状态,轻量锁状态,重量锁状态。

这四种情况会随着竞争情况逐渐升级,锁可以升级,但不能降级(这种只能升级的锁策略是为了提高获得和释放锁的效率)

优点 缺点 使用场景
偏向锁
加锁和解锁不需要额外的开销,

执行非同步方法相比仅存在纳秒的差别

如果线程间存在锁竞争,会带来额外的锁撤销的消耗 只有一个线程访问同步块场景
轻量级锁 竞争的线程不会阻塞,提高了程序的响应速度 如果始终得不到锁竞争的线程,使用自旋会消耗CPU
追求响应时间

同步块执行速度快

重量级锁 线程竞争不使用自旋,不消耗CPU 线程阻塞,响应时间缓慢
追求吞吐量

同步块执行时间较长

时间: 2024-10-21 16:32:03

synchronized实现原理的相关文章

Java多线程和并发(八),synchronized底层原理

目录 1.对象头(Mark Word) 2.对象自带的锁(Monitor) 3.自旋锁和自适应自旋锁 4.偏向锁 5.轻量级锁 6.偏向锁,轻量级锁,重量级锁联系 八.synchronized底层原理 1.对象头(Mark Word) 2.对象自带的锁(Monitor) (1)javap反编译查看原理同步代码块 public class SyncBlockAndMethod { public void syncsTask() { synchronized (this) { System.out.

Java锁----Synchronized实现原理

数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现synchronized的? 本文所指说的JVM是指Hotspot的6u23版本,下面首先介绍synchronized的实现: synchronized关键字简洁.清晰.语义明确,因此即使有了Lock接口,使用的还是非常广泛.其应用层的语义是可以把任何一个非null对象作为"锁",当synch

Synchronized实现原理总结

synchronized实现同步的基础:Java中的每一个对象都可以作为锁.具体表现为以下3种形式. 对于普通同步方法,锁是当前实例对象. 对于静态同步方法,锁是当前类的Class对象. 对于同步方法块,锁是Synchonized括号里配置的对象. 从JVM规范中可以看到Synchonized在JVM里的实现原理,JVM基于进入和退出Monitor对象来实现方法同步和代码块同步.monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,

Synchronized 实现原理

记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized.对于当时的我们来说,synchronized是如此的神奇且强大.我们赋予它一个名字"同步",也成为我们解决多线程情况的良药,百试不爽.但是,随着学习的深入,我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效.随着Javs SE 1.6对synchronized进行各种优化后,synchronized不会显得那么重. synchronized可以保证

Synchronized的原理及自旋锁,偏向锁,轻量级锁,重量级锁的区别(摘抄和理解)

1. 自旋锁的优缺点: 自旋锁 自旋锁原理非常简单,如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞挂起状态,它们只需要等一等(自旋),等持有锁的线程释放锁后即可立即获取锁,这样就避免用户线程和内核的切换的消耗. 但是线程自旋是需要消耗CPU的,说白了就是让CPU在做无用功,线程不能一直占用CPU自旋做无用功,所以需要设定一个自旋等待的最大时间. 如果持有锁的线程执行的时间超过自旋等待的最大时间扔没有释放锁,就会导致其它争用锁的线程在最

一篇文章让你读懂synchronized的原理

  相信熟悉java的同学对synchronized关键字也是非常熟悉了,似乎只要在涉及到线程安全的问题的问题中,加上synchronized关键字就对了! 比如下面这个我们比较常见的代码,懒汉式单例模式: public class LazySimpleSinglethon { private static LazySimpleSinglethon singlethon = null; private LazySimpleSinglethon(){} public synchronized ta

synchronized的底层实现原理

转自:http://www.cnblogs.com/paddix/p/5367116.html 如果对上面的执行结果还有疑问,也先不用急,我们先来了解Synchronized的原理,再回头上面的问题就一目了然了.我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的: 1 package com.paddx.test.concurrent; 2 3 public class SynchronizedDemo { 4 public void method() { 5

Java并发编程:Synchronized及其实现原理

Java并发编程系列[未完]: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 一.Synchronized的基本使用 Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法.Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题.从语法上讲,Synchronized总共有三种用法: (1)修饰普通方法 (2)修饰静态方法 (3)修饰代码块 接下

Synchronized及其实现原理

并发编程中synchronized一直是元老级角色,我们称之为重量级锁.主要用在三个地方: 1.修饰普通方法,锁是当前实例对象. 2.修饰类方法,锁是当前类的Class对象. 3.修饰代码块,锁是synchronized括号里面的对象. 一.synchronized实现原理 当一个线程试图访问同步代码块时,必须得到锁.在退出或抛出异常时必须释放锁,JVM是基于进入和退出Monitor来实现方法同步和代码块同步. 我们来看下synchronized的字节码: public class Synchr