在每个Java对象中都会有一个Monitor对象(也就是这个对象的监听器,原理是一个计数器),当某一个线程在占用这个对象的时候,首先判断这个monitor对象的计数器是不是0,如果是0,说明这个对象还没有被其他线程占用,这时候这个线程就可以占用这个对象了,并且把monitor+1。如果这个monitor不是0,则说明这个对象已经被别的线程给占用了,这个时候,此线程需要等待。当线程释放占用权的时候,monitor-1,。这时候通过 javap 命令查询反编译文件时,是有一个monitorenter和一个monitorexist与之对应的(但是在Synchronized修饰的方法时,是在方法标识中声明的,并没有monitorenter和monitorexist)。