并发编程(三)--synchronized

并发编程(三)--synchronized,第1张

并发编程(三)--synchronized

并发编程(三)--synchronized
    • synchronized原理详解
    • 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(监视器锁),加锁过程如下图所示

锁的膨胀升级过程

锁的状态分为四种,无锁状态,偏向锁,轻量级锁和重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级到重量级锁,但是锁的升级是单向的,只能从低到高升级,不会出现锁的降级。

  1. 偏向锁:它是一种针对加锁 *** 作的优化手段,核心思想是,如果一个线程获得了锁,那么锁就进入偏向模式,当这个线程再次请求锁时,无需做任何同步 *** 作,即获取锁的过程,这样就省去了大量有关锁申请的 *** 作,从而提供程序的性能。
  2. 轻量级锁:轻量级锁能够提供提升程序性能的依据是“对绝大部分的锁,在整个同步周期内都不存在竞争”,轻量级锁所适应的场景是线程交替执行同步块的场合,如果存在同一时间访问同一锁的场景,就会导致轻量级膨胀成重量级锁。
  3. 自旋锁:假设在不久将来,当前线程可以获得锁,因此虚拟机会让当前想要获取锁的线程做几个空循环,一般不会太久,可能是50个循环或100循环在经过若干次循环后,如果得到锁,就顺利进入临界区,如果不能获得锁就升级为重量级锁。
  4. 锁消除:消除锁是虚拟机另一种锁的优化,这种优化更彻底,java虚拟机在第一次编译代码时,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5160486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存