这两种锁都是可重入锁。synchronized内置锁是一种非公平平锁排它锁,是jdk1.8对它做了大量的优化(偏向锁->轻量级锁->重量级锁),所以在没有特殊用途的情况下建议使用synchronized关键字(java语言内置的,加锁释放锁都是已经固化好的我们不需要处理,显示锁是语法层面的锁,有一个固定的范式)。
显示锁有一个固定的结构jdk源码给出的示例如下:
class X {
private final ReentrantLock lock = new ReentrantLock();
// ...
public void m() {
lock.lock();
try {
// ... method body
} finally {
lock.unlock()
}
}
}
即显示锁搭配try{....}finally{..} 语句使用确保锁,不管发生什么情况都能关闭,
注:当一个线程结束时,所持与的所有资源,锁都会释放掉。显示锁除了支持可重入外,还支持超时拿锁,响应中断等。
公平锁就绪线程按照公平策略(按请求顺序)依次等待获得锁,效率低
非公平锁无视等待队列,当锁处于闲置时就竞争获得锁,会出现插队的现象,效率高(线程的上线文切换会有一定的时间消耗,而非公平锁,可以充分的利用这些时间)