synchronized和Lock的异同
- Java提供了两种锁机制实现对某个共享资源的同步:synchronized和Lock
- synchronized:多个线程访问同一个共享资源,将该资源设置为锁对象,调用Object类中wait(),notify()和notifyAll()调度机制进行线程之间的通信。
- Lock:使用Condition进行线程之间的调度
- 两者的区别:
- 用法不一样:synchronized是交给JVM执行的,Lock是通过代码调用实现的,比synchronized有更精准的语义。
- 在需要同步的对象加入synchronized控制,可以加载特定的代码上;也可以加在方法上。在特定的代码块上,括号中为锁对象,也就是要共享的资源。
- Lock现实的指定起始位置和终止位置
- 性能不一样:在JDK1.5中中增加了一个Lock接口的实现类ReentrantLock。它不仅拥有和synchronized相同的并发性和内存语义,还多了锁投票,定时锁,等候和中断锁等。在不同的情况下会有所不同:在竞争资源不是很激烈的情况下,synchronized的性能下降的很快,ReentrantLock性能保持不变
- 锁机制不一样:synchronized获得锁和释放的方式都是在代码块结构中的,当获取多个锁时,必须以相反的顺序释放,并且是自动释放,不会因为出现了异常导致锁没有被释放而引发死锁。ReentrantLock需要手动解锁,必须在finally块中释放,否则会出现死锁问题。
- 可以通过tryLock方法,采用非阻塞方式去尝试获得锁资源
- 用法不一样:synchronized是交给JVM执行的,Lock是通过代码调用实现的,比synchronized有更精准的语义。