相同点:
两者都是可重入锁,他们的加锁方式都是同步,而且都是阻塞式的同步,也就是说当一个线程获得了对象锁,进入了同步块,其它访问概统不快的线程都必须阻塞在同步块外面等待。
不同点:
- 原始构成:Synchronized是Java语言的关键字,是原生层面的互斥,需要jvm实现;而ReentrantLock是JDK1.5之后提供的API层面的互斥锁类。
- 实现:Synchronized是通过JVM来加锁和解锁;ReentrantLock是API层面的加锁和解锁。
- 代码编写:Synchronied不需要用户去手动释放锁,当Synchronied方法或者代码块执行完之后,系统会自动让线程释放对锁的占用,更安全;而ReentrantLock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致死锁现象。
- 等待可中断:Sychronied不可中断,直到代码执行完,才正常释放锁,除非抛出异常,由JVM退出等待;ReentrantLock在持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,可以通过tryLock来设置超时时间,时间过了之后就放弃等待,同时可以将lockInterruptibly()方代码块中,调用interrupt()方法来中断,但是Synchronied不行。