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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余海龙 黑马帝   /  2012-2-9 16:23  /  2090 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余海龙 于 2012-2-9 22:45 编辑

class Test
{
        synchronized static void test1()
        {
               
        }       
       
        synchronized void text2(){}
}
这个类中的两个方法同步吗?

6 个回复

倒序浏览
这两个方法不同步,因为一个是静态的,另一个不是静态的。他们所使用的锁不相同。
静态同步的用的是该类的所属字节码文件对象表现形式是类名.class锁。
而非静态的用的调用对象的锁,表现形式是this这个锁。
所以不能同步。
回复 使用道具 举报
不同步。因为锁不同。

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

2. synchronized void text2(){} 的锁是当前对象this

评分

参与人数 1技术分 +1 收起 理由
唐秀启 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 1毫秒的价值 于 2012-2-9 19:50 编辑

相当不同步,因为test1是静态的,这时候如果调用该方法,只能是类调用,但是同步必须有锁,锁在哪里呢,这时候类加载了,因此会有一个描述这个类的对象存在于内存----这就是字节码文件,表现为:Test.class,因此这时候同步用的锁就是Test.class
test2是非静态的,因此是对象调用,这时候谁去调用,这个同步的锁就是谁,所以就是this
而这两个方法的锁就明显不是同一个了,所以这两个方法是不同步的
回复 使用道具 举报
锁不是同一把,一个this,一个class,怎么开门啊,各不相干
回复 使用道具 举报
不同步。 锁不一样!

回复 使用道具 举报
杨扬 黑马帝 2012-2-9 20:26:22
7#
静态方法是对类锁定,普通方法是对对象锁定
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马