java中每个对象都有一个monitor(监视器锁),当线程运行到synchronize锁定的代码时,会尝试获取monitor锁(执行monitorenter指令),
如果获取到,将该锁的计数器加1(初始值为0),其他的线程想要获取锁时,就会被阻塞,直到前面的线程释放掉monitor锁(执行monitorexit指令)。
synchronize获取和释放锁的工作都是有JVM来完成的,不需要我们自己动手。
相关知识:https://www.cnblogs.com/lycroseup/p/7486860.html