黑马程序员技术交流社区

标题: Thread [打印本页]

作者: 杨强    时间: 2011-12-5 13:20
标题: Thread
本帖最后由 杨强 于 2011-12-5 15:29 编辑

关于synchronized 同步代码块

如果程序是多线程的
在遇到synchronized锁的时候只有一条线程能够进入
那其他线程只是在“门外等”是不是意味着资源的浪费呢

总是有种 同步了 就变成单线程的错觉


作者: 颜秉武    时间: 2011-12-5 13:24
a.同步代码块
        使用 "synchronized(锁对象){同步的代码}" 方式将需要同步的代码加上锁, 一个线程运行的时候, 其他线程不能运行
b.同步方法
如果整个方法中的代码都需要同步, 那么可以在方法签名上加上synchronized修饰
静态方法可以使用当前类的class当做锁对象
非静态方法可以使用调用当前方法的对象当做锁
如果想将代码块与方法同步  可以更改代码块的锁对象

作者: 韩军博    时间: 2011-12-5 13:53
资源固然很重要,但却是在线程是安全的情况下才考虑的,如果是该用同步代码块的地方没用,程序并发执行真的发生了死锁现象,那么程序不仅不会继续运行了,且都卡在那个地方,同样也是资源的浪费。
作者: 颜秉武    时间: 2011-12-5 14:04
对不起 楼主,刚才浏览器看你问题时,显示有问题,只显示了关于synchronized 同步代码块
一句,所以才给出那样的答案,对此感但非常抱歉
作者: 颜秉武    时间: 2011-12-5 14:10
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程

得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。



二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的

非synchronized(this)同步代码块。



三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它

synchronized(this)同步代码块的访问将被阻塞。



四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块

时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
作者: 杨强    时间: 2011-12-5 14:27
永无止境的、 发表于 2011-12-5 14:04
对不起 楼主,刚才浏览器看你问题时,显示有问题,只显示了关于synchronized 同步代码块
一句,所以才给出那样 ...

是我那会按错了 直接发了  不好意思
作者: 杨强    时间: 2011-12-5 14:29
韩军博 发表于 2011-12-5 13:53
资源固然很重要,但却是在线程是安全的情况下才考虑的,如果是该用同步代码块的地方没用,程序并发执行真的 ...

嗯 安全是非常重要的 谢谢
作者: 杨强    时间: 2011-12-5 14:30
永无止境的、 发表于 2011-12-5 14:10
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线 ...

Thank    you




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