1.lock可以使用Condition进行线程之间的调度
Synchronized则使用Object对象本身的notify,wait,nitityall调度
Condition有更好的灵活性,而且一个lock对象可以有多个Condition,从而可以有选择性的调度线程,更加灵活。而synchronized只能针对同一个对象,所有线程都注册在它身上,线程的调度没有选择权,会出现很大的问题
2.lock的锁定是通过代码实现的,而synchronized是在JVM层面实现。
sychronized在锁定时如果方法块抛出异常,JVM会将锁自动释放掉,不会因为出了异常没释放锁造成死锁。但是lock的话就享受不到JVM带来的自动的功能,出现异常时必须在finally将锁释放,否则将会引起死锁。
3.synchronize的局限性:lock提供一种显示的,可轮询的定时的以及可中断的锁获取操作,synchronize是无法中断一个正在等候获得锁的线程,使用synchronize的线程在等待锁时是不能响应中断的。
轮询锁:当不能同时获得所有的锁时,可以使用轮询锁或者定时锁避免死锁。当一个线程需要获得多个锁时,已获得一部分锁,但另一部分不可得,此时会返回失败,释放已获得的锁,重新尝试获得所有锁。通过trylock实现
定时锁:如果这个获得锁的线程由于要等待IO或者其他原因(比如调用了sleep)被阻塞了,但是没有释放锁,其他线程只能等着,这十分影响程序的执行效率。因此需要一种机制可以不让等待的线程一直无期限的等待(比如只能等待一定的时间或者能够响应中断)而LOCK可以办到。
lock提供了读写锁,针对不同的场景可以选择应用。
lock还可以知道线程有没有成功获得锁,这是synchronize无法办到的。