相同:ReentrantLock提供了synchronized类似的功能和内存语义,都是可重入锁。

不同:
1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。在多个条件变量和高度竞争锁的地方,用ReentrantLock更合适,ReentrantLock还提供了Condition,对线程的等待和唤醒等操作更加灵活,一个ReentrantLock可以有多个Condition实例,所以更有扩展性。
2.ReentrantLock必须在finally中释放锁,否则后果很严重,编码角度来说使用synchronized更加简单,不容易遗漏或者出错。
3.ReentrantLock 的性能比synchronized会好点。
4.ReentrantLock提供了可轮询的锁请求,他可以尝试的去取得锁,如果取得成功则继续处理,取得不成功,可以等下次运行的时候处理,所以不容易产生死锁,而synchronized则一旦进入锁请求要么成功,要么一直阻塞,所以更容易产生死锁。 1、Lock的某些方法可以决定多长时间内尝试获取锁,如果获取不到就抛异常,这样就可以一定程度上减轻死锁的可能性。
如果锁被另一个线程占据了,synchronized只会一直等待,很容易错序死锁
2、synchronized的话,锁的范围是整个方法或synchronized块部分;而Lock因为是方法调用,可以跨方法,灵活性更大
3、便于测试,单元测试时,可以模拟Lock,确定是否获得了锁,而synchronized就没办法了 ReentrantLock比synchronized 强大在哪儿?
简单说:
1、ReentrantLock可以实现fair lock public ReentrantLock(boolean fair) {
sync = (fair)? new FairSync() : new NonfairSync();
}
所谓fair lock就是看获得锁的顺序是不是和申请锁的时间的顺序是一致的 2、ReentrantLock支持中断处理 public final void acquireInterruptibly(int arg) throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
if (!tryAcquire(arg))
doAcquireInterruptibly(arg);
}
就是说那些持有锁的线程一直不释放,正在等待的线程可以放弃等待。 3、ReentrantLock可以和condition结合使用 public boolean hasWaiters(Condition condition) {
if (condition == null)
throw new NullPointerException();
if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))
throw new IllegalArgumentException("not owner");
return sync.hasWaiters((AbstractQueuedSynchronizer.ConditionObject)condition);
} public int getWaitQueueLength(Condition condition) {
if (condition == null)
throw new NullPointerException();
if (!(condition instanceof AbstractQueuedSynchronizer.ConditionObject))
throw new IllegalArgumentException("not owner");
return sync.getWaitQueueLength((AbstractQueuedSynchronizer.ConditionObject)condition);
}

最新文章

  1. Linux2 在Linux(CentOS)上配置SSH免登陆
  2. Leetcode: Assign Cookies
  3. PHP中使用Session配合Javascript实现文件上传进度条功能
  4. 【IOS】分享下近一年IOS开发的经验总结
  5. POJ 1159
  6. File类详解
  7. memset,memcpy,memmove,strcpy,strcat,strcmp的实现(其实很简单,每个程序都只有几行代码)
  8. 【LeetCode】3. Longest Substring Without Repeating Characters
  9. PAT乙1002
  10. Android自定义控件系列之应用篇——圆形进度条
  11. 结合JDK源码看设计模式——适配器模式
  12. [Swift]LeetCode504. 七进制数 | Base 7
  13. linux 查找指定进程并kill
  14. 63.1拓展之box-shadow属性
  15. 浅谈servlet与jsp的关系
  16. 尚硅谷springboot学习27-使用外置servlet容器
  17. python全栈开发day18-模块和导入
  18. 七:python 对象类型详解三:列表
  19. 常见排序算法总结 -- java实现
  20. python 套接字之select poll epoll

热门文章

  1. go通过第三方库 mahonia gbk 转utf8
  2. 【Random】-随机数字-jmeter
  3. 标注点(Labeled Point)
  4. DeepLearning - Forard & Backward Propogation
  5. UVa 1585 - Score - ACM/ICPC Seoul 2005 解题报告 - C语言
  6. STM32F4 编程手册学习1_编程模型
  7. JQuery文本框验证
  8. POJ 2449 Remmarguts' Date(第k短路のA*算法)
  9. 解决android invalid symbol: 'switch'
  10. error LNK2019: 无法解析的外部符号 该符号在函数 中被引用 解决方案