没有合适的资源?快使用搜索试试~ 我知道了~
Lock、Synchoronized和ReentrantLock的使用
需积分: 32 0 下载量 157 浏览量
2013-11-11
09:35:02
上传
评论
收藏 22KB DOCX 举报
温馨提示
试读
10页
Lock、Synchoronized和ReentrantLock的使用
资源推荐
资源详情
资源评论
比较
ReentrantLock
和
synchronized
和信号量
Semaphore
实现的同步性能
得出结论:
(1)使用 Lock 的性能比使用 synchronized 关键字要提高 4~5 倍;
(2)使用信号量实现同步的速度大约比 synchronized 要慢 10~20%;
(3)使用 atomic 包的 AtomicInter 速度是比 Lock 要快 1 一个数量级。
:
在资源竞争不是很激烈的情况下,偶尔会有同步的情形下, 是很合适的。原因
在于,编译程序通常会尽可能的进行优化 ,另外可读性非常好,不管用没用过
多线程包的程序员都能理解。
提供了多样化的同步,比如有时间限制的同步,可以被 的同步
( 的同步是不能 的)等。在资源竞争不激烈的情形下,性能稍微比
差点点。但是当同步非常激烈的时候, 的性能一下子能下降好几
十倍。而 确还能维持常态。
和上面的类似,不激烈情况下,性能比 略逊,而激烈的时候,也能维持常态。
激烈的时候, 的性能会优于 一倍左右。但是其有一个缺点,就是只能
同步一个值,一段代码中只能出现一个 的变量,多于一个同步无效。因为他不能在
多个 之间同步。
ReentrantLock 类
java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为
Java 类,而不是作为语言的特性来实现。这就为 Lock 的多种实现留下了空间,各种实现
可能有不同的调度算法、性能特性或者锁定语义。ReentrantLock 类实现了 Lock,它拥有
与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断
锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许
多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线
程上。)
reentrant 锁意味着什么呢?简单来说,它有一个与锁相关的获取计数器,如果拥有锁的某
个线程再次得到锁,那么获取计数器就加 1,然后锁需要被释放两次才能获得真正释放。
这模仿了 synchronized 的语义;如果线程进入由线程已经拥有的监控器保护的
synchronized 块,就允许线程继续进行,当线程退出第二个(或者后续)synchronized 块
的时候,不释放锁,只有线程退出它进入的监控器保护的第一个 synchronized 块时,才释
放锁。
在查看清单 1 中的代码示例时,可以看到 Lock 和 synchronized 有一点明显的区别 ——
lock 必须在 finally 块中释放。否则,如果受保护的代码将抛出异常,锁就有可能永远得不
到释放!这一点区别看起来可能没什么,但是实际上,它极为重要。忘记在 finally 块中释
资源评论
xulin1118
- 粉丝: 0
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功