synchronized底层原理
我们都知道synchronized可以让代码同步,所谓同步代码就是在同一时刻只能有一个线程执行这段代码。
synchronized可以锁对象,例如
pubilc class Demo{
private Object object;
public Demo (Object obj){
this.obj = obj;
}
pubilc void method(){
synchronized(obj){
System.out.println("这里是同步")
}
}
}
可以锁方法,例如
可以锁class对象,像这样同步的静态方法就是锁了当前类的class同步对象
那么synchronized的底层到底是如何实现的呢,我们都听说过synchronized就是锁对象头,那么到底锁的是什么呢,我们先来看看Java对象的布局,Java中的每个对象都有固定的对象头,对象头中有一个mark word,64位的虚拟机中mark word有64个bit,像这样
我们现在就研究synchronized的原理,无需关注太多mark word的内容,只要知道在对象头中有两个bit是用了标志锁,有一个bit标志是否偏向锁,所以synchronized给对象加锁就是修改对象这两个锁标志位的数值,至于具体数值是什么其实我们没有必要记忆,所以所谓synchronized锁对象头,就是修改对象头中的锁标志位的数值,所有的线程都是根据这个锁标志位的数值判断,这个对象是否上锁,这个就是synchronized的底层原理