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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨强 黑马帝   /  2011-12-5 13:20  /  2289 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨强 于 2011-12-5 15:29 编辑

关于synchronized 同步代码块

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

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

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

7 个回复

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

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
资源固然很重要,但却是在线程是安全的情况下才考虑的,如果是该用同步代码块的地方没用,程序并发执行真的发生了死锁现象,那么程序不仅不会继续运行了,且都卡在那个地方,同样也是资源的浪费。

评分

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

查看全部评分

回复 使用道具 举报
对不起 楼主,刚才浏览器看你问题时,显示有问题,只显示了关于synchronized 同步代码块
一句,所以才给出那样的答案,对此感但非常抱歉

评分

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

查看全部评分

回复 使用道具 举报
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程

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



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

非synchronized(this)同步代码块。



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

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



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

时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

评分

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

查看全部评分

回复 使用道具 举报
永无止境的、 发表于 2011-12-5 14:04
对不起 楼主,刚才浏览器看你问题时,显示有问题,只显示了关于synchronized 同步代码块
一句,所以才给出那样 ...

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

嗯 安全是非常重要的 谢谢
回复 使用道具 举报
杨强 黑马帝 2011-12-5 14:30:00
8#
永无止境的、 发表于 2011-12-5 14:10
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线 ...

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