为什么Java同步不能按预期工作?

Ale*_*bbe 1 java multithreading synchronized

我试图找出同步方法的工作原理.根据我的理解,我创建了两个线程T1T2,它们将调用相同的方法addNew,因为该方法是同步的,它不应该执行一个线程的for循环的所有迭代,然后另一个?输出保持不变,有时它会正确打印,有时它会打印T1与T2值混合的值.代码很简单,有人可以指出我做错了什么吗?谢谢.

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new A());
        Thread t2 = new Thread(new A());
        t1.setName("T1");
        t2.setName("T2");
        t1.start();
        t2.start();
    }
}

public class B {
    public synchronized void addNew(int i){
        Thread t = Thread.currentThread();
        for (int j = 0; j < 5; j++) {
            System.out.println(t.getName() +"-"+(j+i));
        }
    }
}

public class A extends Thread {
    private B b1 = new B();

    @Override
    public void run() {
        b1.addNew(100);
    }
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*etz 7

每个A实例都有自己的B实例.该方法addNew是一种实例方法B.因此,在调用期间隐式获取addNew的锁是对接收器B实例的锁定.每个线程都调用addNew不同的B,因此锁定不同的锁.

如果您希望所有 B实例都使用公共锁,请创建一个共享锁,并在其中获取它addNew.