簡體   English   中英

Java-同步

[英]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的方法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();

首先,在同一對象上執行多個Thread時, synchronized才會生效。

在第一種情況下,只有一個Thread可以調用methodAmethodB在同一時間。 當一個人正在執行該方法時,其他人將不得不等待該方法完成。

在第二種情況下,一次只有一個Thread能夠輸入每個synchronized塊。 synchronized塊是

synchronized(objectA){

}

synchronized(objectA){

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM