synchronized关键字的几种用法深入理解

225 阅读2分钟

synchronized关键字的几种用法深入理解,sync可以修饰静态方法和普通方法,也可以修饰代码块。在使用sync的时候,我们首先要确定锁的资源对象到底是什么,是类锁还是对象锁?所以我们要搞清楚这个是对使用sync的深入理解的关键。如果修饰普通方法和普通方法代码块,则多实例对象的多个线程是并行执行的;如果是单实例对象的多个线程,则是串行执行的,因为锁的资源对象是单例(singleton)的。前面说的都是对象锁。接下来说一下类锁,类锁是指sync修饰静态方法,静态方法的代码块或代码块synchronized(XXX.class){},无论是单实例的XXX对象还是多实例的XXX对象的多个线程去访问该XXX类的同步方法(包括静态同步方法)都是串行执行的。类锁锁住的是整个类对象,这个只有一份,而多实例的多个线程之间是互不影响的,因为Thread() t1 =new Thread(new User()),Thread() t2 =new Thread(new User())这个两个对象在jvm heap是两个实例,而synchronized在jvm就是描述该对象的对象头是否持有锁(具体看java对象头结构)。而类锁我的理解就是在jvm方法区描述该类的信息只有一份。如果面试问到sync修饰代码块填写synchronized(lock){} 和synchronized(XXX.class){} 有什么区别,你就从对象锁和类锁的区别回答就好了。注意:如果这个lock是成员变量且 是static修饰的(static Object lock =new Object() ),那么这个还是类锁。这里难以理解的就是类锁。其实我自己是这么比喻理解类锁的,对象锁好比微服务下多个B服务自己jvm的锁,而类锁就像是对此B服务做个一个全局的锁,也就是分布式锁。如果本人描述的有问题,欢迎指出,谢谢