https://www.nowcoder.com/discuss/645770757498249216
- 首先 synchronized 是 java 内置关键字,在 JVM 层面,Lock 是个 Java 类;
- synchronized 无法判断是否获取锁的状态,Lock 可以判断是否获取到锁;
- synchronized 会自动释放锁(a 线程执行完同步代码会释放锁;b 线程执行过程中发生异常会释放锁),Lock 需在 finally 中手工释放锁(unlock() 方法释放锁),否则容易造成线程死锁;
- 用 synchronized 关键字的两个线程 1 和线程 2,如果当前线程 1 获得锁,线程 2 线程等待。如果线程 1 阻塞,线程 2 则会一直等待下去,而 Lock 锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
- synchronized 的锁可重入、不可中断、非公平,而 Lock 锁可重入、可中断、可公平(两者皆可);
- Lock 锁适合大量同步的代码的同步问题,synchronized 锁适合代码少量的同步问题。