实现方式
Lock是代码级别的,synchronized是JVM级别的
公平
Lock可以是公平所,也可以是不公平锁,默认是非公平锁,synchronized是非公平锁
释放
Lock的释放必须手动调用unlock()方法,而synchronized在代码出了代码块或方法之后就会自动释放锁。
等待中断
Lock中如果持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,但是synchroinzed不会
条件变量
Lock中可以有多个Condition来实现线程间通信,而synchronized是能通过当前锁来进行线程通信。
什么时候选择用ReetrantLock代替Synchronized
1、 在确实需要一些synchronized锁没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票的时候
2、 优先推荐synchronized开发,如果事实证明synchronized确实不合适,再用ReetrantLock开发。