Synchronized是由JVM实现的一种互斥同步的一种方式,如果查看Synchronized修饰过的程序块编译后的字节码,会发现,被Synchronized修饰过的程序块,在编译前后被编译器生成了monitorenter和monitorexit两个字节码指令;
这两个指令的含义:在虚拟机执行到monitorenter指令时,首先要尝试获取对象的锁,如果这个对象没有锁定,或者当前线程已经拥有了这个对象的锁,把锁的计数器+1;当执行monitorexit指令时,将锁计数器-1;当计数器为0时,锁就被释放了;
java中synchronized通过在对象头设置标记,达到了获取锁和释放锁的目的;
Sychronized是可重入锁,主要是为了解决自己锁死自己的情况;当同一个类的的两个同步方法使用同一把锁时且两个方法有调用关系存在,如果不支持重入,B方法调用A方法时,A方法去获取锁需等B方法释放,然后就造成阻塞,导致自己锁死自己