一个线程可以访问同步的非静态方法吗?另一个线程可以同时访问同步的静态方法吗?

时间:2013-06-23 17:55:11

标签: java

几天前,我在接受采访时得到了这个问题。一个线程可以访问同步的非静态方法吗?另一个线程可以同时访问同步的静态方法吗?这些方法属于同一个类。我知道答案是肯定的,但我想知道它是如何可行的。感谢。

5 个答案:

答案 0 :(得分:6)

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

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

两者都不同。因此你可以。

答案 1 :(得分:1)

因为对同一两个对象没有强制执行syncrhonization:

  • 通过对象实例获取第一个synchronized锁定(针对非静态方法),
  • 第二次synchronized锁定(针对静态方法)是通过类实例获取的。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

ObPedantry:如果thisjava.lang.Class.class(并且通过调用java.lang.Object.wait尚未释放锁定),则不会。