只是两个同步的方法无法同时运行吗?
例如,有人编写了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个不同的线程调用,那么不能是否同时运行 ?
通过同时运行 ,我的意思是,它们将被排序,以便在另一个启动之前完成。
答案 0 :(得分:1)
假设没有涉及其他同步,则唯一将被相互排除的呼叫是:
firstA.a1()
vs firstA.a1()
firstA.a1()
vs firstA.a3()
secondA.a1()
vs secondA.a1()
secondA.a1()
vs secondA.a3()
firstB.b2()
vs firstB.b2()
这是因为同步块必须使用相同的锁才能使彼此产生影响。将整个方法标记为synchronized
时,锁定对象将为this
的值。因此,firstA
中的方法将完全独立于secondA
或firstB
的方法,因为它们使用不同的锁。
代码中未标记为synchronized
的方法甚至根本不会尝试获取任何锁,它们可以随时运行。
请注意,互斥只是多线程的一个方面。为了使您的程序正常工作,您还必须考虑可见性和安全发布等内容。
答案 1 :(得分:0)
当然,答案取决于"什么"你"做"当你做某事",而且由于你没有表明,没有人可以回答。这就是当您省略重要信息时会发生什么。不要忽略重要信息。
我们可以说A
中的同步方法与B
中的同步方法不使用相同的锁。
如果多个线程访问相同的数据,则它们必须彼此同步。线程彼此同步的唯一方法是使用相同的同步方法。如果那是synchronized
的使用,那么他们必须在同一个监视器上同步(锁定)。因此,如果A
方法和B
方法从不同的线程访问相同的数据,谁可以从你显示的内容中判断它们是否有效?那么他们就不会如图所示工作了。
如果任何未同步的方法访问来自不同线程的相同数据,并且您没有显示的部分没有其他有效的同步方法,那么它们将无法工作。
这一切都取决于你决定不向我们展示的内容。
答案 2 :(得分:0)
所有这些都可以同时运行而不会互相干扰。 因为每个线程处理不同的实例,所以它们不需要等待所谓的同步方法。