A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ⑷嚸V恱 中级黑马   /  2013-8-12 20:34  /  1296 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ⑷嚸V恱 于 2013-8-13 22:04 编辑

       听到生产者和消费者的时候,讲到lock 是jdk1.5的新增加的功能主要是替代synchronized 的,
这是不是异味着lock完全可以替代synchronized呢
?请各童鞋帮助 生产者和消费者的代码如果有需要我会粘出来

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

7 个回复

倒序浏览
可以,既然是新特性,肯定是向下兼容的,这是毫无疑问的。
回复 使用道具 举报
还不要抛弃 synchronized
虽然 ReentrantLock 是个非常动人的实现,相对 synchronized 来说,它有一些重要的优势,但是我认为急于把 synchronized 视若敝屣,绝对是个严重的错误。 java.util.concurrent.lock 中的锁定类是用于高级用户和高级情况的工具 。一般来说,除非您对 Lock 的某个高级特性有明确的需要,或者有明确的证据(而不是仅仅是怀疑)表明在特定情况下,同步已经成为可伸缩性的瓶颈,否则还是应当继续使用 synchronized。
为什么我在一个显然“更好的”实现的使用上主张保守呢?因为对于 java.util.concurrent.lock 中的锁定类来说,synchronized 仍然有一些优势。比如,在使用 synchronized 的时候,不能忘记释放锁;在退出 synchronized 块时,JVM 会为您做这件事。您很容易忘记用 finally 块释放锁,这对程序非常有害。您的程序能够通过测试,但会在实际工作中出现死锁,那时会很难指出原因(这也是为什么根本不让初级开发人员使用 Lock 的一个好理由。)
另一个原因是因为,当 JVM 用 synchronized 管理锁定请求和释放时,JVM 在生成线程转储时能够包括锁定信息。这些对调试非常有价值,因为它们能标识死锁或者其他异常行为的来源。 Lock 类只是普通的类,JVM 不知道具体哪个线程拥有 Lock 对象。而且,几乎每个开发人员都熟悉 synchronized,它可以在 JVM 的所有版本中工作。在 JDK 5.0 成为标准(从现在开始可能需要两年)之前,使用 Lock 类将意味着要利用的特性不是每个 JVM 都有的,而且不是每个开发人员都熟悉的。
什么时候选择用 ReentrantLock 代替 synchronized
既然如此,我们什么时候才应该使用 ReentrantLock 呢?答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 ReentrantLock 还具有可伸缩性的好处,应当在高度争用的情况下使用它,但是请记住,大多数 synchronized 块几乎从来没有出现过争用,所以可以把高度争用放在一边。我建议用 synchronized 开发,直到确实证明 synchronized 不合适,而不要仅仅是假设如果使用 ReentrantLock “性能会更好”。请记住,这些是供高级用户使用的高级工具。(而且,真正的高级用户喜欢选择能够找到的最简单工具,直到他们认为简单的工具不适用为止。)。一如既往,首先要把事情做好,然后再考虑是不是有必要做得更快。
Lock 框架是同步的兼容替代品,它提供了 synchronized 没有提供的许多特性,它的实现在争用下提供了更好的性能。但是,这些明显存在的好处,还不足以成为用 ReentrantLock 代替 synchronized 的理由。相反,应当根据您是否 需要 ReentrantLock 的能力来作出选择。大多数情况下,您不应当选择它 —— synchronized 工作得很好,可以在所有 JVM 上工作,更多的开发人员了解它,而且不太容易出错。只有在真正需要 Lock 的时候才用它。在这些情况下,您会很高兴拥有这款工具。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
牛牛 发表于 2013-8-12 21:07
还不要抛弃 synchronized
虽然 ReentrantLock 是个非常动人的实现,相对 synchronized 来说,它有一些重要 ...

我 仔细看了你发的这个帖子,都是说程序员和习惯的问题,再有就是版本的问题。对于这两个者的时候都是lock比synchronized 有优势, synchronized却没有一条比lock 有优势的呢?
回复 使用道具 举报
貌似是完全可以
回复 使用道具 举报
有个伙伴发的资料,腾讯内部的培训资料中有讲这个。传上来你自己研读下。

腾讯java培训(许冠严).zip

1.97 MB, 下载次数: 37

回复 使用道具 举报
sergio 发表于 2013-8-12 23:23
有个伙伴发的资料,腾讯内部的培训资料中有讲这个。传上来你自己研读下。 ...

好的,非常感谢,我研究一下
回复 使用道具 举报
代替是必须的,要不用synchronized太麻烦,不取消只是为了那些老程序能运行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马