前言
我在猫眼二面的时候面试官问了我一些synchronized的一些面试题,下面跟大家分享一下问题和我的答案,希望对大家有帮助,如果有什么不足的地方,也可以留言我们一起讨论。
问题
问题1:synchronized修饰静态方法和非静态方法有什么区别?
答:如果是非静态方法那么锁的对象本身,如果方法是静态方法那么锁的是类。因为在jvm加载类的时候,类的常量以及静态成员和方法会一起加载,所以当我们在静态方法上加synchronized时,锁的资源是类,所以即使new了两个对象,调用的分别的静态方法也会阻塞。如果还不理解的话,下次我详细举例。
问题2:描述一下synchronized升级的过程
答:synchronized刚开始是一个无锁的状态,当有线程拿到锁时,会升级为偏向锁,把这个线程会做一个标记,当这个线程下次再执行这个方法时,不用去抢锁,当有多个线程同时执行方法时,会从偏向锁升级为轻量级锁,底层是CAS,也就是自旋锁,拿不到锁的线程会进行自旋,当有线程自旋了10次还没拿到锁,那么锁就会升级为重量级锁等待的线程会被操作系统挂起,直到持有锁的线程释放完资源。
问题3:synchronized的轻量级锁和重量级锁相比,轻量体现在哪?
答:自旋锁的优点就是当线程拿不到锁时,通过进行自旋避免被操作系统挂起,避免了上下文切换,但是如果大量的线程拿不到锁而自旋,会非常占用CPU资源,所以当有线程自旋了10次还没拿到锁,那么锁就会升级为重量级锁的原因。
总结
这就是上次猫眼二面有关synchronized的面试题,把以上问题理解,synchronized的问题基本上也就没问题了。