synchronized 和 Lock锁的区别
1.存在层次上
synchronized是Java的关键字,在JVM层面上;
Lock是一个接口。
2.锁的释放上
synchronized --无需手动释放
- 获取锁的线程执行完同步代码,则直接释放锁
- 线程执行同步代码时发生异常,则JVM会让线程释放锁
Lock锁 --必须手动进行释放
- 在finally中调用unlock()进行释放锁,确保加锁次数和释放次数一样,不然很容易造成线程死锁
3.锁的获取上
synchronized 获取锁,线程A持有对象锁,线程B在等待对象锁, 此时线程A执行任务出现sleep阻塞不释放对象锁,线程B则会一直进入等待状态;
Lock锁 , 可以通过tryLock()尝试获取锁,获取不到则不会一直等待。
4.锁的状态上
synchronized 不可判断锁的状态;
Lock锁 可判断锁的状态。
5.锁的类型上
synchronized 可重入锁、不可中断锁、非公平锁;
Lock锁 可重入锁、可中断锁、可公平锁也可非公平锁(构造方法传入true/false)。
6.锁的性能上
synchronized 同步代码块,支持同步少量的代码;
Lock锁 支持同步大量代码。