Java1.5版本之后性能已经不是问题了,为什么还会有Lock这一套呢?重复造轮子真的有意义吗?当然不是。

破坏不可抢占

synchronized 申请资源的时候,如果申请不到,线程直接进入阻塞状态了,而线程进入阻塞状态,啥都干不了,也释放不了线程已经占有的资源。
我们的Lock就可以做到。Lock支持

  1. 中断。Synchronized 的问题是,持有锁 A 后,如果尝试获取锁 B 失败,那么线程就进入阻塞状态,一旦发生死锁,就没有任何机会来唤醒阻塞的线程。但如果阻塞状态的线程能够响应中断信号,也就是说当我们给阻塞的线程发送中断信号的时候,能够唤醒它,那它就有机会释放曾经持有的锁 A。这样就破坏了不可抢占条件了。
  2. 超时。如果线程在一段时间之内没有获取到锁,不是进入阻塞状态,而是返回一个错误,那这个线程也有机会释放曾经持有的锁。这样也能破坏不可抢占条件。
  3. 非阻塞的获取锁。如果没有获取到锁,直接返回。

    可重入锁

    什么是可重入锁:同一个线程可以重复获得的锁。
    如代码所示,线程可以在1处get()方法时获得锁,在2处还可以再次获得锁。是可重入锁。如果是不可冲入锁,在2处会阻塞。 ```java

class X { private final Lock rtl = new ReentrantLock(); int value; public int get() { // 获取锁 rtl.lock(); ② try { return value; } finally { // 保证锁能释放 rtl.unlock(); } } public void addOne() { // 获取锁 rtl.lock();
try { value = 1 + get(); ① } finally { // 保证锁能释放 rtl.unlock(); } } } ```

可重入函数

多个线程可以同时调用该函数,每个线程都能得到正确的结果,同时在一个线程内支持线程切换,结果依旧正确,线程安全。

公平锁&非公平锁

https://tech.meituan.com/2018/11/15/java-lock.html 美团技术团队