[英]Java - synchronize
我研究線程的同步。 當我有這個例子時:
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可以同時調用嗎?
您在第二部分上是正確的,但是第一部分需要澄清。
class A { public synchronized void methodA(){ } public synchronized void methodB(){ } }
此代碼與下一個代碼相同
class A {
public void methodA(){
synchronized (this) {
}
}
public void methodB(){
synchronized (this) {
}
}
}
因此,在一個對象上,只能同時調用一種方法。 相同或其他方法的其他調用將等待。 但是在不同的對象上可以調用任何方法。
目前只有一個線程可以在對象上保持鎖。 對於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();
首先,在同一對象上執行多個Thread
時, synchronized
才會生效。
在第一種情況下,只有一個Thread
可以調用methodA
或methodB
在同一時間。 當一個人正在執行該方法時,其他人將不得不等待該方法完成。
在第二種情況下,一次只有一個Thread
能夠輸入每個synchronized
塊。 synchronized
塊是
synchronized(objectA){
}
和
synchronized(objectA){
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.