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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 442851994 于 2012-11-1 18:18 编辑

class Test
{
synchronized static void sayHello3()
                {
               
                }        
        
                synchronized void getX(){}
}

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

4 个回复

倒序浏览
写错了,应该是  static synchronized void sayHello3(){}
回复 使用道具 举报

 Public synchronized void methodAAA()
  {
  //….
  }
  这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是 说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任 意调用这个被加了synchronized关键字的方法。

  上边的示例代码等同于如下代码:
  public void methodAAA()
  {
  synchronized (this) // (1)
  {
  //…..
  }
  }

getX()获得的锁是实例对象的锁,而static synchronized 修饰的sayHello3()方法的锁,是该类的字节码,一个类的字节码只有一个,但是实例对象却有多个。所以对于对于不同的实例对象,多线程的sayHello3方法是同步的;但是getX()方法,对于多线程的不同对象,不能实现同步。
这个地方讲的同步很不错:http://www.blogjava.net/MEYE/articles/355593.html。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
对于非静态方法来说,synchronized使用this作为同步锁,因为非静态的方法必须由实例对象来调用;
对于静态方法来说,synchronized使用类的字节码Class作为同步锁,因为静态的调用是可以不用类的实例对象的;
静态方法synchronized static void sayHello3(){ }        
和非静态方法synchronized void getX(){}使用的不同的锁,所以是不能够进行同步的。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1

查看全部评分

回复 使用道具 举报
对于非静态方法来说,synchronized使用this作为同步锁,因为非静态的方法必须由实例对象来调用;
对于静态方法来说,synchronized使用类的字节码Class作为同步锁,因为静态的调用是可以不用类的实例对象的;
静态方法synchronized static void sayHello3(){ }        
和非静态方法synchronized void getX(){}使用的不同的锁,所以是不能够进行同步的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马