天天看点

sychronized的实现原理和应用

一、synchronized的使用

1.1修饰方法
public synchronized void method()
{
   // todo
}      
1.2修饰代码块
public  void run() {
          synchronized(this) {
             for (int i = 0; i < 5; i++) {
                try {
                   Thread.sleep(100);
                } catch (Exception e) {
                   e.printStackTrace();
                }
             }
          }
       }      
1.3修饰静态方法
public synchronized static void method() {
   // todo
}      
1.4修饰一个类
class ClassName {
   public void method() {
      synchronized(ClassName.class) {
         // todo
      }
   }
}      

对于普通方法,锁是当前实例对象

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

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

二、对象锁的分析

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

锁是怎么实现代码同步的:

sychronized的实现原理和应用

 这里有个minitor对象,其特点是:在同一时间,只有一个线程/进程能进入monitor所定义的临界区,这使得monitor可以实现互斥的效果,无法进入monitor临界区的进程/线程被阻塞,在适当的时候被唤醒

java对象存储在内存中分为三部分:对象头、实例数据和对齐填充,对象头中存储了锁标识

java对象头分析:

sychronized的实现原理和应用

 Java对象头里的Mark Word里默认存储对象的HashCode、分代年龄和锁标记位

sychronized的实现原理和应用

运行期间,Mark Word里存储的数据会随着锁标志位的变化而变化。Mark Word可能变化为存储一下4种数据 

sychronized的实现原理和应用

锁对象基本原理:

sychronized的实现原理和应用

 当一个线程需要获取Object的锁时,会被放入EntrySet中进行等待,已经获取到锁的线程在缺少谋些外界条件的情况下,可能无法继续进行,那么线程就通过wait()方法将锁释放

进入wait Set区进行等待,当外部条件满足时,先被阻塞的线程就先进去EnterySet区去竞争锁,这个外界条件在monitor机制中被称为条件变量

三、锁的升级

JavaSE1.6中锁一共有四种状态:从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态

偏向锁:

继续阅读