1. 原始构成方面
- synchronized是JVM层面,它是JAVA的关键字,底层是通过monitor对象来完成的。
- Lock是API层面的具体类,它是java5以后新出的一个类。
2. 使用方法
- synchronized 是不需要手动释放锁,当synchronized代码执行完以后,系统会自动让线程释放对锁的占用。
- lock就需要手动去释放锁,若没有主动的去释放锁,就可能导致死锁的现象。
3. 等待是否可中断
- synchronized不能中断,除非是抛出了异常或者是正常执行完成。
- lock是可以中断的,主要是设置超时的方法。
4. 加锁是否公平
- synchronized是非公平锁。
- lock默认是非公平锁,但是也支持公平锁。
5. 是否可以精确唤醒
- synchronized不支持精确唤醒,只能随机唤醒或者是唤醒全部线程。
- lock可支持精确唤醒。