当前位置: 首页 > 知识库问答 >
问题:

静态方法上的 Java 线程锁定

朱浩大
2023-03-14

根据我在 Java 课上的知识

  1. 非静态同步方法:锁定获取特定对象
  2. 静态同步方法:类上的锁获取

我对此有点困惑,因为我们可以通过类名或对象名调用静态方法。

请假设我的类有4个方法,所有方法都是同步的。2个方法是静态的,2个不是静态的。如果我创建了我的类“对象1”的1个对象,并且还有2个线程Thread1和Thread2

问题1:如果我将尝试访问静态同步方法,使用对象1(或类名),这是否意味着“对象1”上没有锁,只有2个静态方法将被锁定(类级锁)?这是否意味着另一个线程可以访问非静态方法,但不能同时使用“对象1”的静态方法

问题2:如果我将尝试在线程1中使用obj1访问非静态同步方法,这是否意味着只有2个方法为线程2锁定?这是否意味着Thread2可以访问2个静态方法,或者我们可以同时使用className(MyClass)访问静态方法?

问题3:如果我的类中所有的方法都是静态和同步的,是不是意味着不会有对象级锁,所有线程只有一个类级锁?

请稍微解释一下类级锁。

共有1个答案

阮俊弼
2023-03-14

即使您使用调用静态方法

someObject.staticMethod()

它没有改变锁在类对象上的事实。这只是意味着你在以一种混乱的方式调用静态方法,你应该正确地调用它。仅仅因为它工作得非常好,并不意味着它应该被使用(除非你打算使你的代码可读性更差)。

类级锁没有什么特别的。它只是使用类对象而不是实例,由于所有的静态同步都使用相同的类对象,所以它的工作方式是一样的。

至于你的最后一个问题,是的。如果您只有静态同步方法,无论您创建了多少个类实例,它们都将共享类对象作为它们的锁。

 类似资料:
  • 问题内容: 有一个简单的愚蠢问题困扰着我,并在我脑海中提出了几个论点。我想排除所有对以下问题的怀疑。 假设有五个线程同时执行一个调用。 线程1调用。 当线程1位于第1节中时,线程2调用。 那么线程1将会发生什么?会进入睡眠状态吗? 当线程1获得机会时,它将从暂停的第1节继续执行吗? 在所有五个线程之间共享一个相同的线程时,该如何处理? 是否有可能互换多个线程发送的消息? 问题答案: 汉斯·帕桑(H

  • 问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。

  • 问题内容: Java教程说:“不可能在同一对象上两次调用同步方法。” 这对于静态方法意味着什么?由于静态方法没有关联的对象,所以synced关键字会锁定在类而不是对象上吗? 问题答案: 由于静态方法没有关联的对象, 所以synced关键字会锁定在类而不是对象上吗? 是。

  • 假设我们有一个类,其中有一个实例方法和静态方法。我们用类级锁同步了静态方法中的块

  • 问题内容: 尝试在静态类中调用非静态方法时遇到错误。 无法从类型播放中静态引用非静态方法methodName() 我不能使该方法静态,因为这也给我一个错误。 此静态方法无法从xInterface隐藏实例方法 有什么办法可以在另一个静态方法中轮回调用非静态方法?(这两种方法位于单独的包和单独的类中)。 问题答案: 从静态方法中调用非静态方法的唯一方法是使类的实例包含非静态方法。根据定义,非静态方法是

  • 我正在尝试用Java编写下面用Kotlin编写的代码。我无法创建DefaultElementsAdapter,因为我无法获得正确的语法。 我无法获得正确的Java代码 Kotlin班是这样的 我正在尝试使用图书馆https://github.com/m7mdra/HtmlRecycler