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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈圳 高级黑马   /  2013-2-22 11:16  /  2685 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈圳 于 2013-2-23 21:05 编辑

看了多线程同步锁,发现,
同步代码块:synchronized()内的对象,没有任何要求,只要是对象就行了.
同步函数非静态用的是this引用.而静态用的是类名.class
那这个同步代码块内的名称是不是存在于栈内存?就如同局部变量一样的标示符名字?
两个独立的同步代码块,只要使用同一个对象的标示符名称就是使用同一把锁了?
那不同类中的多线程run()方法中,操作同一个共享数据.使用了同一个对象名,是不是也会同步?

评分

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

查看全部评分

8 个回复

倒序浏览
1.所谓代码块是指用“{}”括起来的一段代码,根据其位置和声明的不同,可以分为普通代码块、构造块、静态块、和同步代码块。
如果在代码块前加上 synchronized关键字,则此代码块就成为同步代码块。
同步代码块的格式:
synchronized(同步对象){
需要同步的代码;
}
同步对象一般为当前对象,即使用this关键字。
这个this.class也属于一个对象,其实是字节码文件

2.同步的机制在于如何共享资源。至于代码块的内容是不是在栈内存中,是的,因为同步的内容需要共享资源,这个资源必须在栈内存中进行判断
3.两个独立的代码块,如果你写上同一个对象,应该会出现问题,因为锁已接被用了,你不能一锁而用
4.共享的数据要定义在成员变量中,用同一个对象锁肯定不行,一锁不能多用,一般都是用this锁

评分

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

查看全部评分

回复 使用道具 举报
加同步就是为了解决安全问题:为了解决多个线程操作多条共享数据的时候引发的安全问题
一个同步块加一个锁就是为了不让其他线程进去同步代码块,更何况是两个独立的代码块使用同一把锁,肯定是可以同步的
只是降低了效率,一般情况下两个独立的同步代码块可以设置成不同的锁,
就是好让他们同时执行(注:同步里面嵌套同步的时候建议使用同一个锁,不然会照成死锁的)
那么不同类中的多线程run()方法中,操作同一个共享数据.使用了同一个对象名,是可以同步的,但是个人觉得这样就更多线程没什么关系了
还有就是同步代码块中的锁的任意对象,Object obj = new Object();//创建一个Object的对象,引用变量obj在栈内存中,实例new Object()在堆内存中

评分

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

查看全部评分

回复 使用道具 举报
这个帖子应该给技术分啊!!
回复 使用道具 举报
偏執旳、靑春 发表于 2013-2-23 16:51
这个帖子应该给技术分啊!!

版主也很忙的,我们应该体谅,我们只能遍地撒花,争取挖掘,共同交流.本着建立和谐社会的原则,朝着小康家庭的道路前进.话说,今天版主很给力哦.

点评

文采飞扬啊 \(^o^)/~  发表于 2013-2-23 20:48
回复 使用道具 举报
陈圳 发表于 2013-2-23 16:59
版主也很忙的,我们应该体谅,我们只能遍地撒花,争取挖掘,共同交流.本着建立和谐社会的原则,朝着小康家庭的 ...

为了赶17期 最近确实挺忙的 从新申请报名程序  才走到博客这个环节 :'(
回复 使用道具 举报
加油!         
回复 使用道具 举报
张向辉 发表于 2013-2-23 20:49
为了赶17期 最近确实挺忙的 从新申请报名程序  才走到博客这个环节

你还没进去啊?
回复 使用道具 举报
偏執旳、靑春 发表于 2013-2-24 14:11
你还没进去啊?

没有 正一步步走入学环节呢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马