synchronized与ReentrantLock都是可重入锁,区别两者之前,先介绍可重入锁的概念。
可重入锁
同一个线程可以在对象锁还没释放时,可再次获取这个对象的锁。同一个线程每次获取锁,锁的计数器加1,释放一次锁,计数器减1,直到计数器为0,完全释放锁。
synchronized与ReentrantLock区别
- ReentrantLock是一个类,使用灵活,必须配合释放锁
- ReentrantLock手动获取或释放锁
- ReentrantLock只适用代码块锁,synchronized不仅适合代码块,也适用类、变量
- 锁机制不一样。ReentrantLock调用Unsafe的park加锁,synchronized使用对象mark word
顺便提一下synchronized作用不同,它对应锁的是什么?
- 普通方法:锁当前实例
- 静态方法:锁当前类的class对象
- 方法块:锁括号里的对象