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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郑昌奋 中级黑马   /  2013-3-14 13:22  /  1569 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郑昌奋 于 2013-3-15 13:20 编辑

毕老师的视频上说同步可通过加上synchronized ,但是在后面又说可以用Lock对象加锁和UnLock来释放锁来实现。但是从他们两个当中哪个性能更好一点,就是以后如果我们开始的时候用哪个更好一点

点评

如果问题已经解决了,请将分类改为已解决;一定要对别人的回答有相应的回复哦,谢谢  发表于 2013-3-15 08:22

评分

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

查看全部评分

5 个回复

倒序浏览
首先,先明确下synchronized的几个关键点:
A.无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)和之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
synchronized可以加在方法上,也可以加在对象上,通常理解为,只有持有了锁才可以进行对应代码块的执行。
java.util.concurrent.locks包下面提供了一些锁的实现,有读写锁,公平锁等。
将synchronized替换成lock的实现可以提升性能:
1. 大部分应用场景是读写互斥,写和写互斥,读和读不互斥。而synchronized则是都互斥。可以利用读写锁来优化性能,读锁锁住读的代码块,写锁锁住写的代码块。
2. 要确保你在理解原来利用到synchronized的代码逻辑,避免一概而论地把synchronized替换成锁。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 vmvm555 于 2013-3-14 19:43 编辑

后面的性能更好一些,毕竟是新技术吗,新技术的产生就是为了弥补旧技术效率上的不足,就好像让你写一个排序的方法出来,对你可能来说并不难,但是让你写一个效率非常高,算法非常完美的,可能就有点困难,这时候你就可以考虑使用Arrays中的sort(),这就是将新技术代码封装好,具体的逻辑实现你不清楚都没关系,需要用的时候直接调用这个新技术就行了

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 王智威 于 2013-3-14 20:08 编辑

synchronized与lock的性能其实差别不大,主要差别在线程数量上,当线程数量不多时synchronized性能好,当线程数量众多时lock的性能好,但是synchronized用的不方便,还要考虑死锁,用什么当锁,而lock是显式的锁,它用起来不觉得很方便吗?

评分

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

查看全部评分

回复 使用道具 举报
lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁


synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

评分

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

查看全部评分

回复 使用道具 举报
冷叙辰 发表于 2013-3-14 19:24
首先,先明确下synchronized的几个关键点:
A.无论synchronized关键字加在方法上还是对象上,他取得的锁都 ...

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