在多线程并发编程中synchronized被称为重量级锁。
synchronized实现同步的表现形式有以下3种:
1)对于普通方法,锁是当前普通对象;
2)对于静态同步方法,锁是当前类的Class对象;
3)对于同步方法块,锁是synchronized括号里的配置对象。
当一个线程试图访问同步代码块时,它首先必须得到锁,退出或者抛出异常时必须释放锁。
synchronized实现代码块的同步是使用monitorenter和monitorexit指令实现的,方法的同步同样可以使用这两个指令来实现。
monitorenter指令是在编译后插入到同步代码块的开始位置,而monitorexit是插入到方法结束处和异常处,要保证每个monitorenter与monitorexit与之配对。任何对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor的所有权,即尝试获得对象的锁。