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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄泉 中级黑马   /  2014-4-5 16:31  /  2369 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看了多线程的Lock类的视频。看完有点不解,
多线程加上锁的时候,到底是用法synchronized好还是用Lock?:dizzy:

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

5 个回复

倒序浏览
我觉得他们应该可以交换使用吧,lock是1.5之后出现的。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
synchronized 是Java1.4之前提供的用于同步的关键字。
Lock 是Java5之后,新提供的对象。

从代码实现上来说,用synchronized 和Lock 其实效果都差不多。

但Lock 中提供支持多个Condition的场景,从这一点上来说,比synchronized单纯通过一个同步监视器来控制线程,要灵活得多。

也就是说,Lock 的功能完全可以替代synchronized,同时还有更有优势的功能提供。

从学习的角度来讲,都应该去学习一下。从用的角度来讲,视应用场景而定。你觉得哪个方便用哪个。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报 1 0
synrhronized
它可以把任何一个非null对象 作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);
当作用在静态方法时锁住的便是对象对应的Class实例,因为 Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁;
当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。
但是它有一些功能性的限制:它无法中断一个正在等候获得锁的线程,也无法通过投票得到锁,如果不想等下去,也就没法得到锁。
用Lock 可以解决这个问题,但是,可以看到 Lock 和 synchronized 有一点明显的区别 —— lock 必须在 finally 块中释放。否则,如果受保护的代码将抛出异常,锁就有可能永远得不到释放!这一点区别看起来可能没什么,但是实际上,它极为重要。忘记在 finally 块中释放锁,可能会在程序中留下一个定时炸弹,当有一天炸弹爆炸时,要花费很大力气才有找到源头在哪。而使用同步,JVM 将确保锁会获得自动释放。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
当然是建议使用新技术,因为新技术方便而且能快速解决以前线程技术难以解决的问题
回复 使用道具 举报
最好既不使用 Lock/Condition 也不使用 sychronized 关键字,而是尽可能使用 java.util.concurrent 包中更高级的机制,例如阻塞队列等。如果需要手动加锁,尽可能使用 synchronized 关键字。如果还有特别的需要,再使用 Lock/Condition 结构。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马