synchronized与reentrantlock区别
共同点
- 都是协调共享数据访问(互斥作用)
- 都是可重入锁
- 保证可见性和互斥性(最多一个线程在操作数据)
不同点
- reentrantlock显式获得,释放锁
- reentrantlock可响应中断(syn只会一直等待),可轮回
- reentrant是api级别,synchronized是jvm级别
- reentrant可公平
- reentrant可用condition绑定多个条件,指定通知谁
- 底层实现不一样,syn是同步阻塞,悲观并发。Lock是同步非阻塞(也有方法可阻塞),乐观并发策略。
- lock是接口,syn是java关键字
- syn发生异常,会自动释放锁,不会死锁。lock需要finally释放,否则没有主动Unlock就有可能会死锁。
- lock可以直到有没有成功获取锁,syn不行
- lock可以多个线程进行读操作,例如读写锁。增大了集合的并发度。