synchronized 和 Lock 有什么区别:
- synchronized 是Java内置关键字,在jvm层面,Lock是个java类。
- synchronized 无法判断是否获取锁的状态,Lock 可以判断是否获取到锁。
- synchronized 会自动释放锁,Lock 需要在 finally 中手工释放锁(unlock() 方法释放锁),否则容易造成线程死锁。
- 用 synchronized 关键字的两个线程1和线程2,如果当前线程1获得锁,线程2等待。如果线程1堵塞了,线程2会一直等待下去;而Lock 锁就不一定会等待下去,如果尝试获取不到锁,线程可以不同一直等待就结束了。
- synchronized 的锁可重入、不可中断、非公平,而 Lock 锁可重入、可判断、可公平。
- Lock 锁适合大量同步代码的同步问题,而 synchronized 锁适合代码少量的同步问题。
synchronized 和 ReentrantLock 的区别:
synchronized 是Java中的关键字,ReentrantLock是类,这是二者本质区别。既然 ReentrantLock 是类,那么它就提供了比synchronized 更多灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock 比synchronized 的扩展性体现在几点上:
- ReentrantLock 可以对获取锁的等待时间进行设置,这样就避免了死锁发生
- ReentrantLock 可以获取各种锁的信息
- ReentrantLock 可以灵活的实现多路通知
另外,二者的锁机制其实也是不一样的,ReentrantLock 底层调用的是 Unsafe的park 方法加锁,synchronized 操作的应该是对象头中的 mark word。