陈公子的博客

synchronized原理解析

synchronized原理解析

synchronized的三种方式

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

1
2
3
4
synchronized void test1(){
//do something
}

对于静态方同步方法,锁的是当前类的Class对象
1
2
3
4
static synchronized void test2(){
//do something
}

对于同步方法快,锁的是synchronized括号里的对象
1
2
3
4
5
6
void test3(){
synchronized(this){
//do something
}
}

synchronized锁升级

jdk1.6之后,synchronized锁有四种状态,无锁,偏向锁,轻量级锁,重量级。

  • 偏向锁: 存在java对象头里面。
  • 轻量级锁:存在当前线程的栈帧里面
  • 重量级锁: 存在当前对象的monitor对象里面
    锁升级过程:
    无锁状态到偏向锁,当前线程通过cas修改java对象头的锁标志位。
    谝向锁到轻量级锁, 当前线程把java对象头的锁信息copy到栈帧里面
    轻量级锁到重量级锁,把栈帧里面的锁信息copy到对象的monitor里面。
  • 偏向锁和轻量级锁采用cas自旋修改锁状态,重量级锁通过线程信号来实现*
陈勋 wechat
欢迎扫码加入知识星球