【问题标题】:Java - synchronizeJava - 同步
【发布时间】:2018-04-10 20:13:57
【问题描述】:

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

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可以同时调用吗?

【问题讨论】:

  • 如果以下答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道您的问题已得到您满意的解决,并为帮助您的人提供帮助。 See here 以获得完整的解释。

标签: java multithreading


【解决方案1】:

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

class A {
  public synchronized void methodA(){

  }

  public synchronized void methodB(){

  }
}

此代码与下一个代码相同

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

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

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

【讨论】:

    【解决方案2】:

    此时只有一个线程可以持有对象的锁。对于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();
    

    【讨论】:

    • 好的结论是每个对象只有一个内部锁并且锁只能由一个线程持有
    【解决方案3】:

    首先synchronized在有多个Thread在同一个对象上执行时生效。

    在第一种情况下,一次只有一个Thread 可以调用methodAmethodB。当一个人正在执行该方法时,其他人将不得不等待该方法完成。

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

    的花括号内的块
    synchronized(objectA){
    
    }
    

    synchronized(objectA){
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多