1. 层面 synchronized属于jvm层面,是java的关键字,是内置特性;而Lock属于api层面,是java5后产生的一个接口
2. 释放锁 synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
3. 用法 不一样。synchronized既可以加在方法上,也可以加载特定的代码块上,括号中表示需要锁的对象。而Lock需要显示地指定起始位置和终止位置。synchronzied是托管给jvm执行的,Lock锁定是通过代码实现的。
4. 性能 上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。
5. 异常 synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
6. 中断 Lock可以让等待锁的线程响应中断(tryLock(Long timeout,TimeUnit unit)),而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。Lock可以提高多个线程进行读操作的效率。
7. 底层实现 synchronized底层用monitor对象完成 (monitorenter、monitorexit)
8. 锁公平 synchronized是非公平锁;ReentrantLock可以是公平锁,也可以是非公平锁,默认是非公平锁,通过构造方法传入boolean值来确定。
9. Condition synchronized没有;ReentrantLock用以实现分组唤醒需要唤醒的线程,可以精确唤醒,而不像synchronized要么随机唤醒一个,要么全部唤醒。