同时使用synchronized方法和普通方法运行对象?

时间:2017-03-14 17:07:36

标签: java concurrency synchronized

只是两个同步的方法无法同时运行吗?

例如,有人编写了2个Java类。

public class A {
    public synchronized void a1(){   
    //do something   }
    public void a2(){
    //do something   }
    public synchronized int a3(){
    int var = 0;
    //do something changing var
    return var;   } }


public class B {

  public void b1(){
    //do something
  }


  public synchronized int b2(){   
    int var = 0;
    //do something changing var
    return var;
  }

  public void b3(){
    //do something
  }
}

使用主要方法,

public static void main(String[] args){
  A firstA = new A();
  A secondA = new A();
  B firstB = newB();

  //create some threads that perform operations on firstA, secondA and first B and start them
}

假设它们并行运行并在创建的对象上调用方法,并且假设其他机制都没有阻止这些方法在当前运行。

在我给出的示例中的方法中,如果同时由2个不同的线程调用,那么不能是否同时运行

通过同时运行 ,我的意思是,它们将被排序,以便在另一个启动之前完成。

3 个答案:

答案 0 :(得分:1)

假设没有涉及其他同步,则唯一将被相互排除的呼叫是:

  1. firstA.a1() vs firstA.a1()
  2. firstA.a1() vs firstA.a3()
  3. secondA.a1() vs secondA.a1()
  4. secondA.a1() vs secondA.a3()
  5. firstB.b2() vs firstB.b2()
  6. 这是因为同步块必须使用相同的锁才能使彼此产生影响。将整个方法标记为synchronized时,锁定对象将为this的值。因此,firstA中的方法将完全独立于secondAfirstB的方法,因为它们使用不同的锁

    代码中未标记为synchronized的方法甚至根本不会尝试获取任何锁,它们可以随时运行。

    请注意,互斥只是多线程的一个方面。为了使您的程序正常工作,您还必须考虑可见性和安全发布等内容。

答案 1 :(得分:0)

当然,答案取决于"什么"你"做"当你做某事",而且由于你没有表明,没有人可以回答。这就是当您省略重要信息时会发生什么。不要忽略重要信息。

我们可以说A中的同步方法与B中的同步方法不使用相同的锁。

如果多个线程访问相同的数据,则它们必须彼此同步。线程彼此同步的唯一方法是使用相同的同步方法。如果那是synchronized的使用,那么他们必须在同一个监视器上同步(锁定)。因此,如果A方法和B方法从不同的线程访问相同的数据,谁可以从你显示的内容中判断它们是否有效?那么他们就不会如图所示工作了。

如果任何未同步的方法访问来自不同线程的相同数据,并且您没有显示的部分没有其他有效的同步方法,那么它们将无法工作。

这一切都取决于你决定不向我们展示的内容。

答案 2 :(得分:0)

所有这些都可以同时运行而不会互相干扰。 因为每个线程处理不同的实例,所以它们不需要等待所谓的同步方法。