黑马程序员技术交流社区
标题:
synchronized 、Lock
[打印本页]
作者:
郑昌奋
时间:
2013-3-14 13:22
标题:
synchronized 、Lock
本帖最后由 郑昌奋 于 2013-3-15 13:20 编辑
毕老师的视频上说同步可通过加上synchronized ,但是在后面又说可以用Lock对象加锁和UnLock来释放锁来实现。但是从他们两个当中哪个性能更好一点,就是以后如果我们开始的时候用哪个更好一点
作者:
冷叙辰
时间:
2013-3-14 19:24
首先,先明确下synchronized的几个关键点:
A.无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)和之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
synchronized可以加在方法上,也可以加在对象上,通常理解为,只有持有了锁才可以进行对应代码块的执行。
java.util.concurrent.locks包下面提供了一些锁的实现,有读写锁,公平锁等。
将synchronized替换成lock的实现可以提升性能:
1. 大部分应用场景是读写互斥,写和写互斥,读和读不互斥。而synchronized则是都互斥。可以利用读写锁来优化性能,读锁锁住读的代码块,写锁锁住写的代码块。
2. 要确保你在理解原来利用到synchronized的代码逻辑,避免一概而论地把synchronized替换成锁。
作者:
vmvm555
时间:
2013-3-14 19:38
本帖最后由 vmvm555 于 2013-3-14 19:43 编辑
后面的性能更好一些,毕竟是新技术吗,新技术的产生就是为了弥补旧技术效率上的不足,就好像让你写一个排序的方法出来,对你可能来说并不难,但是让你写一个效率非常高,算法非常完美的,可能就有点困难,这时候你就可以考虑使用Arrays中的sort(),这就是将新技术代码封装好,具体的逻辑实现你不清楚都没关系,需要用的时候直接调用这个新技术就行了
作者:
王智威
时间:
2013-3-14 20:06
本帖最后由 王智威 于 2013-3-14 20:08 编辑
synchronized与lock的性能其实差别不大,主要差别在线程数量上,当线程数量不多时synchronized性能好,当线程数量众多时lock的性能好,但是synchronized用的不方便,还要考虑死锁,用什么当锁,而lock是显式的锁,它用起来不觉得很方便吗?
作者:
沈子豪
时间:
2013-3-14 21:04
lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中
作者:
郑昌奋
时间:
2013-3-15 13:19
冷叙辰 发表于 2013-3-14 19:24
首先,先明确下synchronized的几个关键点:
A.无论synchronized关键字加在方法上还是对象上,他取得的锁都 ...
嗯,明白
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2