接下来的几篇文章来记录下java里锁相干的知识点。

锁是用来管制多个线程访问共享资源的形式,在Lock之前,锁性能是靠synchronized实现的,Lock既然能呈现,必定是synchronized在有些状况下满足不了,咱们来比照下两者的异同:

  1. 实现原理

    • synchronized,通过monitorenter/monitorexit两个指令来实现的,前者指令是在编译后插入到同步代码块开始地位,而后者指令是插入到办法完结和异样处,任何一个对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。
    • lock,次要通过同步器队列(AQS)实现。
  2. 出现异常时

    • synchronized,当出现异常时会主动开释锁,不会导致死锁。
    • lock,不会主动开释锁,须要在finally里显示开释。
  3. 是否可中断

    • synchronized,不能中断,必须期待线程执行实现。
    • lock,能够响应中断。
  4. 是否反对读写锁

    • synchronized,不反对读写锁。
    • lock,可通过ReadWriteLock实现读写锁。
  5. 是否可重入

    • synchronized,反对重入。
    • lock,可通过ReentrantLock实现可重入。
  6. 是否做到管制多个线程同时访问共享资源

    • synchronized,做不到。
    • lock,能够做到。

最初,再来看下Lock接口的办法:


其中的tryLock()尝试非阻塞的获取锁,调用该办法后立即返回,获取到了锁返回true,否则返回false。
newCondition()获取期待告诉组件,该组件和以后锁绑定,以后线程只有获取了锁能力调用此组件的wait()办法,调用后,以后线程将开释锁。