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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 飘哥1988 高级黑马   /  2013-5-29 17:06  /  1611 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么 同步函数被静态修饰后 使用的锁是 该方法所在类的字节码文件对象,即 类名.class文件 不懂这个锁的原理 还是java就是这样规定的?

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

5 个回复

倒序浏览
被静态修饰后,该方法随类的运行就会加载(静态方法进内存时,根本没有本类对象,但是有字节码文件对象)所以是类名.class   
java 中有很多规则,你不用去详细的知道为什么这样做才对。 只要知道这样做就可以了!

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
貌似是被静态修饰后在类还没有创建对象的时候,这个方法就已经进到方法区里面了,你如果想要调用这个方法就必须用类名调用了,我想应该和这个原理相同吧!
回复 使用道具 举报
类的方法被static修饰,使用方法的时候就不需要创建对象了。

也就是说,当前方法没有this引用。所以就不能用this。也就不能直接使用同步函数

static synchronized void method(){} //这个方法是错误的。 不能实现同步

只能在函 数中使用一个不变的对象作为监视器。

可以使用当前类的字节码作为监视对象。当然也可以使用其他的。只要保证唯一即可

评分

参与人数 1技术分 +1 收起 理由
刘胜寒 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 石贤芝 于 2013-5-30 22:18 编辑

这是考虑到生命周期的问题。既然要用一把锁,就要保证这把锁在用的时候是在内存中的。

静态同步函数用类名就可以调用,如果用其他的对象作为锁,在调用静态同步函数的时候,这个作为对象的锁可能已经被垃圾回收了,不能保证这个锁是存在的。

而静态同步函数所在类的字节码文件对象的生命周期很长,直到这个java程序结束以前,它都是存在的,这就保证了如果用 类名.class 作为锁,锁会一直存在。

回复 使用道具 举报
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马