很高兴成为这个社区的一部分。阅读了许多答案,消除了我对许多问题的疑问,但没有找到与此有关的一个。我知道同步在Java中是如何工作的,但是当线程通过另一个类调用同步方法时,会困惑地看到行为偏离。

PSB我尝试了什么:

具有同步方法“ meth1”的A类。

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同步。因此,您正在不同的对象上进行同步。一个同步调用不会阻止另一个同步调用,因为两个线程都使用不同的监视器。

关于java - 当线程通过另一个类调用同步方法时会发生什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22205850/

10-09 17:53
查看更多