synchronized的关键字在java并发编程中占有相当中要的地位。并且从jdk1.6开始做了很大的改变,其性能也得到了很大的提升,在实际的开发中可以很方便的使用。
同时synchronized关键字也是面试当中经常会遇到的一个问题,那么当面试官问其底层原理时该怎么回答呢?
1、修饰代码块
当synchronized修饰代码块时,javac编译后的字节码会生成对应的monitorenter和monitorexit指令分别对应synchronized同步块的进入和退出(可以通过javap进行反编译查看),当执行 monitorenter 指令时,线程试图获取锁也就是获取 monitor的持有权.当计数器为0则可以成功获取,获取后将锁计数器设为1也就是加1。相应的在执行 monitorexit 指令后,将锁计数器设为0,表明锁被释放。如果获取对象锁失败,那当前线程就要阻塞等待,直到锁被另外一个线程释放为止。
2、修饰方法
而对于synchronized方法而言,javac为其生成了一个ACCSYNCHRONIZED关键字,在JVM进行方法调用时,发现调用的方法被ACCSYNCHRONIZED修饰,则会先尝试获得锁。其获取锁的原理与代码块相同。
以上的回答已经可以满足面试官的要求了,如果要更深入的理解其原理,需要了解其对象锁monitor的结构和原理。