与synchronized相同,ReentrantLock也是一种互斥锁;
synchronized与ReentrantLock的对比:
-
可以再次获取自己的内部锁,即:一个线程获取某对象锁,在没有释放此对象锁的同时,可以再次获得此锁;
一个锁每次被线程获取,锁计数器就增加1,知道锁计数器将为0,才能释放锁;
-
Synchronized依赖于JVM,ReenTrantLock依赖于API
Synchronized的很多优化,都是在JVM层面优化的,并不暴露给用户;
ReenTrantLock的各种功能实现,都可以用户自己通过调用API进行实现(lock,unLock);
-
ReenTrantLock增加了高级功能
-
等待可中断
// 调用: lock.lockInterruptibly( );
让等待锁的线程,放弃等待,去执行别的事情。
-
-
可实现公平锁
Synchronized默认非公平;ReenTrantLock默认也是非公平锁;
// 构造公平锁: Lock lock=new ReentrantLock(true)
-
锁可以绑定Condition,实现选择性通知
synchronized关键字与wait()和notify/notifyAll()方法相结合可以实现等待/通知机制;
ReentrantLock借助于与锁绑定的condition对象,来调用await()和signal/signalAll()方法来实现;
-
ReentrantLock可以实现tryLock
对于没有拿到锁的线程,可以令其做一些别的事情,不会阻塞;
-
在JVM各种锁机制的优化下,Synchronized在很多地方都默认使用CAS的乐观锁,进行优化了;
所以并不是ReentrantLock性能更强!!