很高兴成为这个社区的一部分。阅读了许多答案,消除了我对许多问题的疑问,但没有找到与此有关的一个。我知道同步在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/