黑马程序员技术交流社区

标题: 求助 同步函数的锁的问题 [打印本页]

作者: 飘哥1988    时间: 2013-5-29 17:06
标题: 求助 同步函数的锁的问题
为什么 同步函数被静态修饰后 使用的锁是 该方法所在类的字节码文件对象,即 类名.class文件 不懂这个锁的原理 还是java就是这样规定的?
作者: 夜默    时间: 2013-5-29 17:17
被静态修饰后,该方法随类的运行就会加载(静态方法进内存时,根本没有本类对象,但是有字节码文件对象)所以是类名.class   
java 中有很多规则,你不用去详细的知道为什么这样做才对。 只要知道这样做就可以了!
作者: 小石头39910    时间: 2013-5-29 17:38
貌似是被静态修饰后在类还没有创建对象的时候,这个方法就已经进到方法区里面了,你如果想要调用这个方法就必须用类名调用了,我想应该和这个原理相同吧!
作者: Super_Class    时间: 2013-5-29 18:00
类的方法被static修饰,使用方法的时候就不需要创建对象了。

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

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

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

可以使用当前类的字节码作为监视对象。当然也可以使用其他的。只要保证唯一即可
作者: 石贤芝    时间: 2013-5-30 22:15
本帖最后由 石贤芝 于 2013-5-30 22:18 编辑

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

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

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


作者: 殇_心。    时间: 2013-5-31 10:14
如果问题已解决,请及时修改分类,否则继续提问,谢谢合作!




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