黑马程序员技术交流社区

标题: lock 和synchronize有什么区别 [打印本页]

作者: 花开~的季节    时间: 2012-3-10 10:47
标题: lock 和synchronize有什么区别
lock 和synchronize在实现多线程中,有什么不同
作者: 杨波    时间: 2012-3-10 10:57
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
作者: 王睿    时间: 2012-3-10 11:22
我觉得lock就是cynchronized 的升级版,可以实现后者的所有功能。并且使用起来更加灵活,但在释放锁时后者会自动释放,前者需要在finally中手动释放。
作者: 刘豪杰    时间: 2012-3-10 11:22
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放 锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

作者: 冯旭君    时间: 2012-3-10 11:34
synchronized是一个关键字,你加上此关键字的代码,无论是方法还是代码块,只能并且只能一个线程调用被synchronized修饰的地方。而Lock可以用其子类实现加上“读锁”可供多个线程一起读,加上“写锁”其作用就和synchronized一样了,只供一个线程。Lock可以获得Condition,Condition可以很好的解决多个线程交互问题。
作者: 刘豪杰    时间: 2012-3-10 11:52
synchronized块的确不错,但是他有一些功能性的限制:
1. 它无法中断一个正在等候获得锁的线程,也无法通过投票得到锁,如果不想等下去,也就没法得到锁。
2.synchronized 块对于锁的获得和释放是在相同的堆栈帧中进行的。多数情况下,这没问题(而且与异常处理交互得很好),但是,确实存在一些更适合使用 非块结构锁定的情况。
java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。这就为 Lock 的多种实现留下了空间,各种实现可能有不同的调度算法、性能特性或者锁定语义。
作者: 刘豪杰    时间: 2012-3-10 11:53
JDK 官方文档中提到:
ReentrantLock是“一个可重入的互斥锁 Lock,它具有与使用 synchronized  方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。
ReentrantLock 将由最近成功获得锁,并且还没有释放该锁的线程所拥有。当锁没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁并返回。如果当前线程已经拥有该锁,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。 ”

简单来说,ReentrantLock有一个与锁相关的获取计 数器,如果拥有锁的某个线程再次得到锁,那么获取计数器就加1,然后锁需要被释放两次才能获得真正释放。这模仿了 synchronized 的语义;如果线程进入由线程已经拥有的监控器保护的 synchronized 块,就允许线程继续进行,当线程退出第二个(或者后续) synchronized 块的时候,不释放锁,只有线程退出它进入的监控器保护的第一个 synchronized 块时,才释放锁。
ReentrantLock  类(重入锁)实现了 Lock ,它拥有与 synchronized 相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性 能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2