- synchronized原理详解
- synchronized底层原理
- 锁的膨胀升级过程
synchronized 内置锁是对象锁(锁的是对象而非引用),作用粒度是对象,可以用来实现对临界的同步互斥访问,是可重入的。
加锁方式:
1.同步实例方法,锁是当前实例对象
public class Testcase { public synchronized void test(){}; }
2.同步类方法,锁是当前类对象
public class Testcase { static synchronized void test(){}; }
3.同步代码块,锁是括号里的对象
public class Testcase { static void test(){ Object obj=new Object(); synchronized (obj){ System.out.println("锁"); } }; }synchronized底层原理
synchronized是基于jvm内置锁的实现,通过内部对象Monitor(监视器锁)实现,基于进入与退出Monitor对象实现方法与代码块同步,监视器锁的实现依赖底层 *** 作系统的Mutex lock(互斥锁)实现,他是一个重量级锁性能较低。
jvm内置锁在1.5版本之后做出了重大的优化,如锁粗化,锁消除,轻量级锁,偏向锁,适应自旋等技术减少锁 *** 作的开销,内置锁的并发性能已经基本与Lock持平。
synchronized关键字被编译成字节码后会被翻译成monitorenter 和 monitorexit 两条指令分别在同步块逻辑代码的起始位置与结束位置。
每个同步对象都有一个自己的Monitor(监视器锁),加锁过程如下图所示
锁的状态分为四种,无锁状态,偏向锁,轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级到重量级锁,但是锁的升级是单向的,只能从低到高升级,不会出现锁的降级。
- 偏向锁:它是一种针对加锁 *** 作的优化手段,核心思想是,如果一个线程获得了锁,那么锁就进入偏向模式,当这个线程再次请求锁时,无需做任何同步 *** 作,即获取锁的过程,这样就省去了大量有关锁申请的 *** 作,从而提供程序的性能。
- 轻量级锁:轻量级锁能够提供提升程序性能的依据是“对绝大部分的锁,在整个同步周期内都不存在竞争”,轻量级锁所适应的场景是线程交替执行同步块的场合,如果存在同一时间访问同一锁的场景,就会导致轻量级膨胀成重量级锁。
- 自旋锁:假设在不久将来,当前线程可以获得锁,因此虚拟机会让当前想要获取锁的线程做几个空循环,一般不会太久,可能是50个循环或100循环在经过若干次循环后,如果得到锁,就顺利进入临界区,如果不能获得锁就升级为重量级锁。
- 锁消除:消除锁是虚拟机另一种锁的优化,这种优化更彻底,java虚拟机在第一次编译代码时,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)