同步方法可以同时执行吗?

时间:2010-11-04 09:21:13

标签: java

我创建了2个对象和2个线程。 假设m1()和m2()是同步方法。

t1.m1(); t2.m2();  两个线程可以同时执行吗?同步方法是否可以同时执行?

5 个答案:

答案 0 :(得分:2)

同步在特定实例上发生。同步方法在调用方法的实例上同步。因此,t1.m1()t2.m2() 可以同时执行,当且仅当t1t2引用不同的实例时。

答案 1 :(得分:1)

是的,如果两者都是非静态的并且使用两个不同的实例执行。

已添加说明。

因为monitor实际上与实例相关联。因此,如果一个线程在一个实例上获取了锁,则该线程可以在另一个实例上自由调用该方法。

答案 2 :(得分:1)

它们可以同时执行,因为同步方法会锁定实例。

synchronized void someMethod(){
}

相同
void someMethod(){
   synchronized(this){
   }
}

因此每个实例都有自己的锁同步。

静态方法使用类实例(SomeClass.class)。

答案 3 :(得分:0)

是的,如果它们是不同实例的实例方法,则它们不会发生同步。

答案 4 :(得分:0)

始终在监视器上完成同步。一次只能有一个线程访问监视器。

在同步方法时,监视器可以是对象(非静态)或类对象(静态方法)。

你应该想到

public synchronized void myMethod(){
  ...
}

为:

public void myMethod(){
  synchronized (this) {
    ...
  }
}

由于您有两个具有synchronized方法的独立对象实例,因此您有两个不同的监视器。 结果:两个线程可以同时工作。