前几天在面试中被问到这个问题。一个线程可以访问同步的非静态方法,而另一个线程可以同时访问同步的静态方法吗?这些方法属于同一类。我知道答案是肯定的,但我想知道这怎么可能。谢谢。
问问题
1341 次
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 this
is java.lang.Class.class
(并且锁还没有通过调用 a 被释放java.lang.Object.wait
)。
于 2013-06-23T22:02:42.933 回答