接下来的几篇文章来记录下java里锁相干的知识点。
锁是用来管制多个线程访问共享资源的形式,在Lock之前,锁性能是靠synchronized实现的,Lock既然能呈现,必定是synchronized在有些状况下满足不了,咱们来比照下两者的异同:
实现原理
- synchronized,通过monitorenter/monitorexit两个指令来实现的,前者指令是在编译后插入到同步代码块开始地位,而后者指令是插入到办法完结和异样处,任何一个对象都有一个monitor与之关联,当且一个monitor被持有后,它将处于锁定状态。
- lock,次要通过同步器队列(AQS)实现。
出现异常时
- synchronized,当出现异常时会主动开释锁,不会导致死锁。
- lock,不会主动开释锁,须要在finally里显示开释。
是否可中断
- synchronized,不能中断,必须期待线程执行实现。
- lock,能够响应中断。
是否反对读写锁
- synchronized,不反对读写锁。
- lock,可通过ReadWriteLock实现读写锁。
是否可重入
- synchronized,反对重入。
- lock,可通过ReentrantLock实现可重入。
是否做到管制多个线程同时访问共享资源
- synchronized,做不到。
- lock,能够做到。
最初,再来看下Lock接口的办法:
其中的tryLock()尝试非阻塞的获取锁,调用该办法后立即返回,获取到了锁返回true,否则返回false。
newCondition()获取期待告诉组件,该组件和以后锁绑定,以后线程只有获取了锁能力调用此组件的wait()办法,调用后,以后线程将开释锁。