java并发:synchronized的实现原理与应用

前言:

在多线程并发编程中synchronized一直是元老角色,很多人都会称呼它重量级锁。

先来看下利用synchronized实现同步的基Java中的每一个象都可以作为锁。具体表现 为以下3种形式。

       ·对于普通同步方法,锁是当前实例对象。

       ·对于静态同步方法,锁是当前类的Class对象。

       ·对于同步方法块,锁是Synchonized括号里配置的对象。

当一个线试图访问同步代码块时,它首先必得到,退出或抛出异常须释。 那么锁到底存在哪里呢?里面会存什么信息呢?

       SynchonizedJVM里的实现原理: 

      JVM基于入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一码块同步是使用monitorentermonitorexit指令实现的,而方法同步是使用另外一种方式实现的,细节JVM范里并没有 详细说明。但是,方法的同步同可以使用两个指令来实现。 monitorenter指令是在编译后插入到同步代码块开始位置,而monitorexit是插入到方法束处异常JVM要保每个monitorenter对应monitorexit与之配任何象都有一个monitor与之关,当且一个monitor被持有后,它将定状线行到monitorenter指令时,将会尝试获象所对应monitor的所有,即尝试获象的

 

1、Java对象头

         synchronized用的是存在Java里的。如果象是数组类型,机用3个字宽 (Word)存储对,如果象是非数组类型,2储对。在32位虚机中,1宽 等于4,即32bit,如表所示。

       Java对里的Mark Word里默储对象的HashCode、分代年锁标记位。32JVM 的Mark Word的默储结构如表所示。

                                                                              对象头存储结构

 Mark Word可能变 化为以下4种数据:

 

2、锁的升级与对比

      Java SE 1.6为了减少锁带来的性能消耗,引入了偏向级锁,在 Java SE 1.6中,一共有4种状级别从低到高依次是:无、偏向级锁状态和重量级锁几个状会随着争情况逐可以升但不能降,意味着偏向锁级锁后不能降成偏向却不能降的策略,目的是了提高获得的效率,下文会详细分析。

 2.1、偏向锁

       大多数情况下,锁不不存在多线争,而且是由同一线程多次得,让线的代价更低而引入了偏向。当一个线访问同步并获取锁时,

  • 栈帧锁记录里存储锁偏向的线ID
  • 之后该线程在入和退出 同步块时不需要CAS操作来加和解
  • 只需要简单测试一下Mark Word里是否 着指向当前线程的偏向
  • 如果测试成功,表示线程已经获得了
  • 如果测试要再测试一下Mark Word中偏向标识是否置成1(表示当前是偏向
  • 如果没有置,使用CAS;如果置了,则尝试使用CAS的偏向指向当前线程。

1)偏向的撤

      偏向锁使用了一种等到争出的机制,所以当其他线尝试竞争偏向锁时, 持有偏向锁线程才会。偏向的撤,需要等待全局安全点(在时间点上没有正在执行的字节码)。它会首先有偏向线程,然后检查持有偏向线程是否活着, 如果线程不于活头设置成无;如果线程仍然活着,有偏向栈会被执行,遍偏向象的锁记录中的锁记录Mark Word要么重新偏向于其他线程,要么恢复到无或者标记对象不适合作偏向,最后停的线程。下图中的线程1演示了偏向初始化的流程,线2演示了偏向的流程。

2)关偏向

        偏向锁Java 6Java 7里是默启用的,但是它在用程序启几秒之后才激活,如 有必要可以使用JVM参数来关-XX:BiasedLockingStartupDelay=0。如果你确定用程 序里所有的锁通常情况下争状,可以通JVM参数关偏向-XX:- UseBiasedLocking=false,那么程序默级锁

2.2、 轻量级锁

   (1级锁

        线程在行同步之前,1.JVM会先在当前线程的栈桢用于存储锁记录,2.并将中的Mark Word复制到锁记录,官方称Displaced Mark Word。3.然后线尝试使用CAS将中的Mark Word换为指向锁记录的指。如果成功,当前线,如果失败,表示其他线,当前线程便尝试使用自旋来

   (2级锁

        轻锁时,会使用原子的CAS操作将Displaced Mark Word回到,如果成功,则表示没有生。如果失,表示当前存在争,就会膨成重量级锁2-2是 两个线程同夺锁的流程

    

因为自旋会消耗CPU了避免无用的自旋(比如线程被阻塞住了),一旦级成重量级锁,就不会再恢复到级锁。当锁处个状下,其他线试图获锁时,都会被阻塞住,当持有锁线之后会线程,被醒的线程就会行新一轮的夺锁之争。

3.锁的优缺点对比

     锁的优缺点对比如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值