首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java中synchronized 用在实例方法跟对象方法上面的区别

2013-03-28 
Java中synchronized 用在实例方法和对象方法上面的区别? ? ??修饰类方法(static 方法):? ? ? ?修饰方法里

Java中synchronized 用在实例方法和对象方法上面的区别

? ? ??修饰类方法(static 方法):

? ? ? ?修饰方法里面语句块:

? ? ??注意:这里不能用synchronized修饰方法外面的语句块(我把他叫做类语句块),虽然我们可以在方法外面定义语句块,这样做会遇到编译错误,这里涉及到了Java里面的对象初始化的部分知识。大概的原因就是synchronized锁住的是对象,当初始化对象的时候,JVM在对象初始化完成之前会调用方法外面的语句块,这个时候对象还不存在,所以就不存在锁了。

? ? ? 那么,在static方法和非static方法前面加synchronized到底有什么不同呢?

? ? ? static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,就是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。而非static方法获取到的锁,就是当前调用这个方法的对象的锁了。所以,他们之间不会产生互斥。

? ? ? 实例1:

? ? ? ?运行结果:

? ? ? ?运行结果:

? ? ? ?运行结果:

? ? ? ?运行结果:

staticMethod:0staticMethod:1staticMethod:2staticMethod:3staticMethod:4staticMethod:5staticMethod:6staticMethod:7staticMethod:8staticMethod:9normalMethod:0normalMethod:1normalMethod:2normalMethod:3normalMethod:4normalMethod:5normalMethod:6normalMethod:7normalMethod:8normalMethod:9

热点排行