簡體   English   中英

當一個線程通過另一個類調用synchronized方法時會發生什么?

[英]What happens when a synchronized method is called by a thread via another class?

感覺很高興成為這個社區的一員。 已閱讀了很多答案,清除了我對許多問題的懷疑,但沒有找到一個。 我知道Java中的同步是如何工作的,但是當線程通過另一個類調用synchronized方法時,我會感到困惑。

PSB我試過的:

A類同步方法“meth1”。

package threadinterview;

public class A {
public synchronized void meth1()
{
    for(int i=0; i<3; i++)
    {
        System.out.println("meth1: " + Thread.currentThread().getName());
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            System.out.println("Interrupted: " + Thread.currentThread().getName());
        }
    }
}

具有非同步方法“meth2”的B類

package threadinterview;

public class B {
public void meth2() {
    A a1 = new A();
    a1.meth1();
}
}

運行項目的主類

package threadinterview;
public class ThreadImpl {
public static void main(String[] args) {
    final B b1 = new B();
    final B b2 = new B();

    new Thread(new Runnable() {

        @Override
        public void run() {
            b1.meth2();
        }
    }).start();

    new Thread(new Runnable() {

        @Override
        public void run() {
            b1.meth2();
        }
    }).start();
}
}

現在在這種情況下,即使我最終運行同步方法,我也看不到同步的效果。 這是我運行程序時得到的:

meth1: Thread-0
meth1: Thread-1
meth1: Thread-0
meth1: Thread-1
meth1: Thread-0
meth1: Thread-1

如果我同步方法也是靜態的,那么我得到類級別鎖定並且可以看到同步效果。 我真的不明白為什么類級鎖定有效但對象級別在這種情況下不起作用。

每次打電話

public void meth2() {
    A a1 = new A();
    a1.meth1();
}

創建一個新的A對象。 synchronized的方法同步上this ,對象本身。 因此,您正在同步不同的對象。 一個同步調用不會阻止其他同步調用,因為兩個線程都會獲得不同的監視器。

我認為你誤解了'同步效應'是什么。 在您的示例中,您從兩個單獨的線程調用B.meth2() 此方法創建A類的新實例,然后調用A.meth1() 現在無論您試圖在meth1()上執行什么鎖定(從您的示例或描述中都不是很清楚),這是無關緊要的,因為您在A類的兩個不同實例上調用它,即您隱式使用兩個不同的鎖。

暫無
暫無

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

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