1.synchronized的实现原理  
        synchronized是Java 中的一个很重要的关键字,主要用来加锁,synchronized所添加的锁有以下几个特点。synchronized的使用方法比较简单,主要可以用来修饰方法和代码块。根据其锁定的对象不同,可以用来定义同步方法和同步代码块。
 
2.synchronized特性  
synchronized是Java中的一个很重要的关键字,主要用来加锁,synchronized具有以下特性:互斥性 阻塞性 可重入性 
 
3.锁的具体表现:  
 
         对于普通同步方法,锁是当前  
 实  
 例  
 对  
 象。   
 
 
         对于静  
 态  
 同步方法,  
 锁  
 是当前  
 类  
 的  
 Class  
 对  
 象。   
 
 
         对于同步方法  
 块  
 ,  
 锁  
 是  
 Synchonized  
 括号里配置的  
 对  
 象。   
 
4.monitor(监视锁)  
          为了解决线程安全的问题,Java提供了同步机制、互斥锁机制,这个机制保证了在同一时刻只一个线程能访问共享资源。 
 
 
5.synchronized锁的是什么?  
          无论是给静态方法或者非静态方法,加上synchronized标识,都是锁的对象,synchronized的普通方法,其实锁的是具体调用这个方法的实例对象,而synchronized的静态方法,其实锁的是这个方法锁属于的类对象。 
 
6.synchronized的锁升级过程是怎样的?  
6.1为什么要锁升级?  
          在JDK1.6及之前的版本中,synchronized锁是通过对象内部的一个叫做监视器锁(也称对象锁)来实现的。当一个线程请求对象锁时,如果该对象没有被锁住,线程就会获取锁并继续执行。如果该对象已经被锁住,线程就会进入阻塞状态,直到锁被释放。这种锁的实现方式称为“重量级锁”,因为获取锁和释放锁都需要在操作系统层面上进行线程的阻塞和唤醒,而这些操作会带来很大的开销。 
 
 
  所以,在Java中,锁的状态分为四种,分别是无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。 
 
6.2 不同锁状态下的对象头中 mark word结构  
 
 
 
6.3 偏向锁  
 
  
          大多数情况下,锁  
  不  
  仅  
  不存在多  
  线  
  程  
  竞  
  争,而且  
  总  
  是由同一线  
  程多次  
  获  
  得,  
  为  
  了  
  让线  
  程  
  获  
  得  
  锁  
  的代价更低而引入了偏向  
  锁  
  。当一个  
  线  
  程  
  访问  
  同步  
  块  
  并获取  
  锁时  
  ,会在  
  对  
  象  
  头  
  和  
  栈帧  
  中的  
  锁记录  
  里存  
  储锁  
  偏向的  
  线  
  程  
  ID  
  ,以后  
  该线  
  程在  
  进  
  入和退出同步块时  
  不需要  
  进  
  行  
  CAS  
  操作来加  
  锁  
  和解  
  锁  
  ,只需  
  简单  
  地  
  测试  
  一下  
  对  
  象  
  头  
  的  
  Mark Word  
  里是否存储  
  着指向当前  
  线  
  程的偏向  
  锁  
  。如果  
  测试  
  成功,表示  
  线  
  程已  
  经获  
  得了  
  锁  
  。如果  
  测试  
  失  
  败  
  ,  
  则  
  需要再测试  
  一下  
  Mark Word  
  中偏向  
  锁  
  的  
  标识  
  是否  
  设  
  置成  
  1  
  (表示当前是偏向  
  锁  
  ):如果没有  
  设  
  置,  
  则使用CAS  
  竞  
  争  
  锁  
  ;如果  
  设  
  置了,  
  则尝试  
  使用  
  CAS  
  将  
  对  
  象  
  头  
  的偏向  
  锁  
  指向当前  
  线  
  程。  
 
 
 
   触发条件:首次进入synchronized块是自动开启。 
 
 
  
6.3.1偏向 锁 的撤 销    
 
  
          偏向锁  
  使用了一种等到  
  竞  
  争出  
  现  
  才  
  释  
  放  
  锁  
  的机制,所以当其他  
  线  
  程  
  尝试竞  
  争偏向  
  锁时,  
  持有偏向锁  
  的  
  线  
  程才会  
  释  
  放  
  锁  
  。偏向  
  锁  
  的撤  
  销  
  ,需要等待全局安全点(在  
  这  
  个  
  时间  
  点上没有正在执  
  行的字  
  节码  
  )。它会首先  
  暂  
  停  
  拥  
  有偏向  
  锁  
  的  
  线  
  程,然后  
  检查  
  持有偏向  
  锁  
  的  
  线  
  程是否活着,如果线  
  程不  
  处  
  于活  
  动  
  状  
  态  
  ,  
  则  
  将  
  对  
  象  
  头设  
  置成无  
  锁  
  状  
  态  
  ;如果  
  线  
  程仍然活着,  
  拥  
  有偏向  
  锁  
  的  
  栈会被执  
  行,遍  
  历  
  偏向  
  对  
  象的  
  锁记录  
  ,  
  栈  
  中的  
  锁记录  
  和  
  对  
  象  
  头  
  的  
  Mark Word  
  要么重新偏向于其他线程,要么恢复到无  
  锁  
  或者  
  标记对  
  象不适合作  
  为  
  偏向  
  锁  
  ,最后  
  唤  
  醒  
  暂  
  停的  
  线  
  程。  
 
 
  
 6.4 轻量级锁  
 (1)轻量级加锁  
  
   
           线程在  
   执  
   行同步  
   块  
   之前,  
   JVM  
   会先在当前  
   线  
   程的  
   栈桢  
   中  
   创  
   建用于存  
   储锁记录  
   的空  
   间  
   ,并将对  
   象  
   头  
   中的  
   Mark Word  
   复制到  
   锁记录  
   中,官方称  
   为  
   Displaced Mark Word  
   。然后  
   线  
   程  
   尝试  
   使用CAS将  
   对  
   象  
   头  
   中的  
   Mark Word  
   替  
   换为  
   指向  
   锁记录  
   的指  
   针  
   。如果成功,当前  
   线  
   程  
   获  
   得  
   锁  
   ,如果失败,表示其他  
   线  
   程  
   竞  
   争  
   锁  
   ,当前  
   线  
   程便  
   尝试  
   使用自旋来  
   获  
   取  
   锁  
   。   
  
 
  ( 2 ) 轻 量 级锁 解 锁   
           轻量  
   级  
   解  
   锁时  
   ,会使用原子的  
   CAS  
   操作将  
   Displaced Mark Word  
   替  
   换  
   回到  
   对  
   象  
   头  
   ,如果成   
  
 
   
   功,  
   则  
   表示没有  
   竞  
   争  
   发  
   生。如果失  
   败  
   ,表示当前  
   锁  
   存在  
   竞  
   争,  
   锁  
   就会膨  
   胀  
   成重量  
   级锁  
   。  
  
 
   
  6.5 重量级锁  
  
            当轻量级锁的CAS操作失败,即出现了实际的竞争,锁会进一步升级为重量级锁。当锁状态升级到重量级锁状态时,JVM会将该对象的锁变成一个重量级锁,并在对象头中记录指向等待队列的指针。 
   
 
   
    
            因为  
    自旋会消耗  
    CPU  
    ,  
    为  
    了避免无用的自旋(比如  
    获  
    得  
    锁  
    的  
    线  
    程被阻塞住了),一旦  
    锁  
    升  
    级 成重量级锁  
    ,就不会再恢复到  
    轻  
    量  
    级锁  
    状  
    态  
    。当  
    锁处  
    于  
    这  
    个状  
    态  
    下,其他  
    线  
    程  
    试图获  
    取  
    锁时  
    ,都会被阻塞住,当持有锁  
    的  
    线  
    程  
    释  
    放  
    锁  
    之后会  
    唤  
    醒  
    这  
    些  
    线  
    程,被  
    唤  
    醒的  
    线  
    程就会  
    进  
    行新一  
    轮的夺锁  
    之争。  
   
 
   6.6 锁的优缺点对比