我研究线程的同步。 当我有这个例子时:
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可以同时调用吗?
答案 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
方法methodA
和methodB
,使用不同的对象进行锁定。因此,在下面的代码中,两个不同的线程可以同时调用方法。
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
一次可以拨打Thread
或methodA
。当一个人正在执行该方法时,其他人将不得不等待该方法结束。
在第二种情况下,一次只能有一个methodB
能够输入每个Thread
块。 synchronized
块是
synchronized
和
synchronized(objectA){
}