Java - 同步

时间:2018-04-10 20:13:57

标签: java multithreading

我研究线程的同步。 当我有这个例子时:

class A {
  public synchronized void methodA(){

  }

  public synchronized void methodB(){

  }
}

class B {
  private final Object objectA = new Object(); 
  private final Object objectB = new Object();

  public void methodA(){
    synchronized(objectA){

    }
  }

  public void methodB(){
    synchronized(objectB){

    }
  }
}

在第一种情况下,两个方法的所有调用都必须序列化是正确的吗?方法不能同时调用,只有一个方法来自"同步"方法可以在当前时间调用。

在第二种情况下对象的水平。当前只有一个线程可以调用一个方法。但方法A和B可以同时调用吗?

3 个答案:

答案 0 :(得分:2)

你在第二部分是正确的,但第一部分需要澄清。

class A {
  public synchronized void methodA(){

  }

  public synchronized void methodB(){

  }
}

此代码与下一代码相同

class A {
  public void methodA(){
       synchronized (this) {
       }
  }

  public void methodB(){
       synchronized (this) {
       }
  }
}

因此,在一个对象上,只能同时调用一个方法。其他相同或其他方法的调用将等待。但是在不同的对象上可以调用任何方法。

答案 1 :(得分:1)

此刻只有一个线程可以锁定对象。对于class B方法methodAmethodB,使用不同的对象进行锁定。因此,在下面的代码中,两个不同的线程可以同时调用方法。

B b = new B();
Thread t1 = new Thread(() -> {b.methodA()});
Thread t2 = new Thread(() -> {b.methodB()});
t1.start();
t2.start();

但在class A中,您使用this进行锁定。因此,在下面的代码中,将序列化调用,因为只有一个线程可以锁定类A的对象。这是因为同一个对象用作两个方法的锁。

A b = new A();
Thread t1 = new Thread(() -> {a.methodA()});
Thread t2 = new Thread(() -> {a.methodB()});
t1.start();
t2.start();

答案 2 :(得分:0)

首先,lap.text在同一对象上执行多个synchronized时生效。

在第一种情况下,只有一个Thread一次可以拨打ThreadmethodA。当一个人正在执行该方法时,其他人将不得不等待该方法结束。

在第二种情况下,一次只能有一个methodB能够输入每个Thread块。 synchronized块是

的卷曲括号内的块
synchronized

synchronized(objectA){

}