黑马程序员技术交流社区

标题: 同步问题 [打印本页]

作者: 余海龙    时间: 2012-2-9 16:23
标题: 同步问题
本帖最后由 余海龙 于 2012-2-9 22:45 编辑

class Test
{
        synchronized static void test1()
        {
               
        }       
       
        synchronized void text2(){}
}
这个类中的两个方法同步吗?
作者: 杜明辉    时间: 2012-2-9 16:29
这两个方法不同步,因为一个是静态的,另一个不是静态的。他们所使用的锁不相同。
静态同步的用的是该类的所属字节码文件对象表现形式是类名.class锁。
而非静态的用的调用对象的锁,表现形式是this这个锁。
所以不能同步。
作者: 王_涛    时间: 2012-2-9 17:02
不同步。因为锁不同。

1. synchronized static void test1(){}  的锁是Test.class

2. synchronized void text2(){} 的锁是当前对象this
作者: 戚雪晖    时间: 2012-2-9 19:48
本帖最后由 1毫秒的价值 于 2012-2-9 19:50 编辑

相当不同步,因为test1是静态的,这时候如果调用该方法,只能是类调用,但是同步必须有锁,锁在哪里呢,这时候类加载了,因此会有一个描述这个类的对象存在于内存----这就是字节码文件,表现为:Test.class,因此这时候同步用的锁就是Test.class
test2是非静态的,因此是对象调用,这时候谁去调用,这个同步的锁就是谁,所以就是this
而这两个方法的锁就明显不是同一个了,所以这两个方法是不同步的
作者: 李泽霖    时间: 2012-2-9 20:07
锁不是同一把,一个this,一个class,怎么开门啊,各不相干
作者: 刘元霄    时间: 2012-2-9 20:12
不同步。 锁不一样!


作者: 杨扬    时间: 2012-2-9 20:26
静态方法是对类锁定,普通方法是对对象锁定




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