2

前几天在面试中被问到这个问题。一个线程可以访问同步的非静态方法,而另一个线程可以同时访问同步的静态方法吗?这些方法属于同一类。我知道答案是肯定的,但我想知道这怎么可能。谢谢。

4

5 回答 5

6

非静态方法的同步对象是对象本身 ( this)。

静态方法的同步对象是.class实例。

两者是不同的。因此你可以。

于 2013-06-23T18:01:04.757 回答
1

因为未对相同的两个对象强制执行同步:

  • 在对象实例上获取第一个synchronized锁(对于非静态方法),
  • 通过类实例获取第二个synchronized锁(用于静态方法)。
于 2013-06-23T17:58:49.587 回答
1

如果您在类上有同步的非静态方法,则锁定对象将为YourClass.this. 如果您在同一个类上有一个静态同步方法,则锁定对象将是YourClass.class. 这是两个不相互排斥的不同锁。这就是为什么两个线程可以同时访问这两个方法的原因。

于 2013-06-23T18:00:43.297 回答
1

需要考虑的重要一点是,这些方法在什么对象上同步?对于非静态(只是一个常规的对象方法),它将在类的实际实例上同步(this - 您使用“new”创建的对象)。对于静态方法,您在类本身上同步它(没有实例对象)。

这是两个不同的对象,所以同步不会停止同时运行的方法。

于 2013-06-23T18:00:55.490 回答
0

ObPedantry:不是 if thisis java.lang.Class.class(并且锁还没有通过调用 a 被释放java.lang.Object.wait)。

于 2013-06-23T22:02:42.933 回答