gpt4 book ai didi

多线程使用的Java Synchronized和static synchronized方法

转载 作者:行者123 更新时间:2023-11-29 09:38:03 25 4
gpt4 key购买 nike

我一直对以下场景感到困惑

MyClass只有一个对象,有两个线程T1,T2。现在一个线程说 T2 将能够使用同步方法 m1(),它具有唯一的 MyClass 对象锁,而其他线程 T2 将在尝试访问 m1() 时被阻塞。

现在我的看法是,如果 T2 将尝试通过访问静态共享字段来访问静态同步方法 m2(),它将被阻塞,因为当前对象锁与 T1 相关,并且将无法执行 m2(),如果有两个Myclass 的对象,然后 T2 线程将能够访问 m1()。我是对还是错?

class MyClass
{

public static int i = 5;

public synchronized void m1()
{
System.out.println(i); //uses static field i of MyClass
//T1 is executing this method
}

public static synchronized void m3()
{
//T2 will be able to call this method on same object lock while it is using
//static field i???
System.out.println(i);//uses static field i of MyClass
}
}

这很困惑,请帮忙。提前致谢。

最佳答案

Now my perception is that if T2 will try to access non synchronized method m2() it will get blocked as current object lock is with T1

没有。 m2() 不是同步的,因此没有什么可以阻止它。这就是同步方法和非同步方法之间的区别。

当一个线程试图进入一个同步方法时,它会阻塞直到它能够获得合适的监视器(锁)。它会在退出方法时释放锁。对于非同步方法,这些步骤都不会发生。

(顺便说一句,我个人建议在大多数情况下根本不要使用同步方法。相反,方法中,在的引用上同步> 在该类中已知。这使得对代码的推理更容易,因为只有您的类才能获得该锁。)

关于多线程使用的Java Synchronized和static synchronized方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13585435/

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