gpt4 book ai didi

java - 当线程通过另一个类调用同步方法时会发生什么?

转载 作者:行者123 更新时间:2023-12-02 06:06:50 25 4
gpt4 key购买 nike

成为这个社区的一员感觉很好。已经阅读了很多答案,消除了我对许多问题的疑虑,但没有找到适合这一问题的答案。我知道同步在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com