答案 0 :(得分:6)
非静态方法的同步对象是对象本身(this
)。
静态方法的同步对象是.class
实例。
两者都不同。因此你可以。
答案 1 :(得分:1)
因为对同一两个对象没有强制执行syncrhonization:
synchronized
锁定(针对非静态方法),synchronized
锁定(针对静态方法)是通过类实例获取的。答案 2 :(得分:1)
如果类上有同步的非静态方法,则锁定对象将为YourClass.this
。如果在同一个类上有静态同步方法,则锁定对象将是YourClass.class
。这是两个不相互排斥的不同锁。这就是为什么两个线程可以同时访问这两个方法的原因。
答案 3 :(得分:1)
要考虑的重要一点是,同步的那些方法是什么对象?对于非静态(只是常规的对象方法),它将在类的实际实例上同步(这是您使用'new'创建的对象)。对于静态方法,您要在类本身上进行同步(没有实例对象)。
这是两个不同的对象,因此同步不会停止同时运行的方法。
答案 4 :(得分:0)
ObPedantry:如果this
为java.lang.Class.class
(并且通过调用java.lang.Object.wait
尚未释放锁定),则不会。