黑马程序员技术交流社区

标题: synchronized替换成lock [打印本页]

作者: 刘 佳    时间: 2012-10-15 12:06
标题: synchronized替换成lock
本帖最后由 刘 佳 于 2012-10-15 12:09 编辑

最大区别在哪里?主要是视频后段话没明白,毕老师说lock最牛的地方在于。。。。这里就没懂牛在哪?它比synchronized强在哪呢?

还有interrupt的使用,interrupt不是抛出异常吗?为何不处理?我看API里面说接收一个异常,接收异常是什么意思?搞糊涂了,希望有人能指点迷津

作者: 李建强    时间: 2012-10-15 13:05
不知道前面synchronized的唤醒你看懂没有,
多个线程操作资源时,
本方线程会唤醒本方线程,多生产或者多消费。
解决方法是全部唤醒。每次唤醒都while判断比较。
Lock中,
一个锁对应多个Condition,代表多个线程
可以实现只操作对方线程。

假设A获取锁,B将等待A释放锁,
     synchronized ,如果A不释放,B将一直等下去,不能被中断
     ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情。

当然,Lock还有其他的好处,可以去看它的方法。




作者: 刘 佳    时间: 2012-10-15 13:09
李建强 发表于 2012-10-15 13:05
不知道前面synchronized的唤醒你看懂没有,
多个线程操作资源时,
本方线程会唤醒本方线程,多生产或者多消 ...

这个明白,就是老毕最后说的那段话没明白,什么synchronized怎么怎么样会导致嵌套同步死锁。然后lock就不会,,什么意思呢?
作者: 李建强    时间: 2012-10-15 13:32
刘 佳 发表于 2012-10-15 13:09
这个明白,就是老毕最后说的那段话没明白,什么synchronized怎么怎么样会导致嵌套同步死锁。然后lock就不 ...

因为Lock只有一个锁,当然不会死锁。
condition只是一个条件,这个条件可以认为是一个标记,具体是通过代码实现的。
condition是一个接口,通过Lock的newCondition与Lock绑在一块。
一个锁可以绑多个condition。
一个锁有多个条件,每个条件下面有多个线程,可以精确处理这个条件下的线程,让他们等待、唤醒等。

synchronized就不可以,因为它的等待、唤醒等都是使用的Object的方法,处理很粗糙。
才会出现同时唤醒所有,同时等待所有的情况,不能分条件处理。

condition很抽象,它不是自然事物,而是一种代码控制手段。

作者: 王乐    时间: 2012-10-15 13:56
刘 佳 发表于 2012-10-15 13:09
这个明白,就是老毕最后说的那段话没明白,什么synchronized怎么怎么样会导致嵌套同步死锁。然后lock就不 ...

在1个synchronized同步的代码中,如果想使用多个wait notify方法的话就必须创建多个synchronized锁,因为1个synchronized只能对应1组wait notify方法。  这样就出现了synchronized中还有synchronized。就是锁的嵌套使用。  那之所以定义synchronized一定时是有多个线程在同时执行。  这样就为死锁的出现提供了条件,并不是1定会导致死锁

而如果在使用lock同步代码实现多个await方法的话,不需要再创建多个Lock锁,只要多个condition对象就可以做到,这样只有1个锁,再多的线程也不会出现死锁
作者: 刘 佳    时间: 2012-10-15 14:11
王乐 发表于 2012-10-15 13:56
在1个synchronized同步的代码中,如果想使用多个wait notify方法的话就必须创建多个synchronized锁,因为 ...

嗯,就是你说的这段话。
如果想使用多个wait notify方法的话就必须创建多个synchronized锁,因为1个synchronized只能对应1组wait notify方法。
就是这句话不理解什么意思?为什么一个synchronized只能对应一组wait notify啊?
作者: 王乐    时间: 2012-10-16 11:33
刘 佳 发表于 2012-10-15 14:11
嗯,就是你说的这段话。
如果想使用多个wait notify方法的话就必须创建多个synchronized锁,因为1个synch ...

记得视频里的教程调用wait的时候好像省略了this,可能就是因为这个把你弄晕了
在程序执行到wait语句的时候,程序做了2个动作。
1是冻结线程
2是释放该对象上的锁


只有释放了该synchronized的锁,才能有第二个线程进来,才能执行到下面的notify。
notify也一样,比如a.notify唤醒的也是因为执行a。wait语句冻结的线程。
那既然wait还有1个释放锁的任务要执行,它当然要定义在锁中。才有锁可以释放。且它的调用对象应该是和当年线程所持的锁对象一致。否则会出现异常。所以就出现了1个synchronized对应1组wait notify的情况



作者: 刘 佳    时间: 2012-10-16 12:12
王乐 发表于 2012-10-16 11:33
记得视频里的教程调用wait的时候好像省略了this,可能就是因为这个把你弄晕了
在程序执行到wait语句的时候 ...

哦,谢谢,有点明白了,我再体会体会




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