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

我对在多线程java中使用静态方法感到困惑?

谭桐
2023-03-14

关于静态的东西:

  • 类共享静态方法的实例

类似的问题:

  • Java:何时使用静态方法
  • “静态”关键字在类中有什么作用?

我感到困惑的是:

  • 静态方法只有一个内存块?
  • 如果我在多线程中使用静态方法,会阻塞吗?

共有3个答案

胡承悦
2023-03-14

静态方法只有一个内存块?

不,方法没有内存块。执行这些方法的线程需要。每个线程在堆栈上都有自己的内存,用来存储所有的方法参数和变量。

如果我在多线程中使用静态方法,会阻塞吗

一个线程不能访问另一个线程的内存,但是如果有一些资源属于所有实例并且应该按顺序访问,那么您可以同步或锁定静态方法,从而使其成为阻塞方法。否则,没有。

邓欣可
2023-03-14

每个线程都有自己的堆栈空间,每次线程调用方法(静态或虚拟)时,调用分配一个堆栈帧,该堆栈帧保存局部变量。这没有什么是特定于静态方法的。

静态方法可以由多个线程并发调用,除非您专门做了一些事情来阻止它,例如要求调用方获取锁(例如使用synchronized关键字)。

静态方法适用于没有共享状态的情况。在访问或修改线程安全共享状态的情况下,它们可能没问题,具体取决于所需的并发级别以及所访问的线程安全内容的效率。

注意瓶颈。将同步关键字放在静态方法上可能是个问题,因为这会限制您的应用程序一次只能用一个线程调用它。替代策略包括使用原子对象、使用为高并发设计的线程安全数据结构或使用线程限制可能比锁定更可取。

公西宏毅
2023-03-14

我感到困惑的是:

静态方法只有一个内存块?如果我在多线程中使用静态方法,它会阻塞吗

Java中的静态关键字只是表示“不考虑或不知道对象的任何特定实例”

实例方法可以使用this访问其关联实例的字段,但静态方法没有关联实例,因此this没有意义。

在多线程中,线程安全包括保护可变数据的一致性和完整性。因为对象封装了它们的实例字段的状态,所以实例方法只需要在多个线程将访问同一个对象的情况下关心线程安全。

因此,虽然对象的线程约束对于类的实例来说是有效的线程安全策略,但同样的推理对于静态方法来说是无效的,因为它们没有实例。

这和内存块完全没有关系。这只是与访问有关。通过引用访问对象实例。如果引用是线程受限的,那么引用所指向的对象将总是线程安全的。但是任何可以访问您的类的线程都有可能访问它的静态成员,因为使用它们不需要引用实例。

默认情况下,静态方法是非阻塞的。如果愿意,您可以实现自己的同步/线程安全策略,并让您的静态方法阻塞。

 类似资料:
  • 这是我第一次在我的新项目中使用Java线程池,在我遇到这个链接之后http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor.html,我对此更困惑,这是页面上的代码, 在代码中,创建了一个固定大小的池,创建了10个工作线程,我说得对吗? 线程池应该减少系统

  • 但是如果我对if语句进行注释,则输出是正确的,即 所以,我不知道它为什么会发生,如何修复?这是我的代码:

  • 问题内容: 在碰到此链接http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using- executors-and-threadpoolexecutor 之后,这是我第一次为新项目使用Java线程池。 .html ,我对此更加困惑,这是页面中的代码, 在代码中,创建了一个固定大小的池并创建了10个工作线程,对吗? 线程池应该

  • 我用这样的JAVA_OPTS启动了 jvm: 过了一段时间,当我查看GC日志时:

  • 问题内容: 与此代码有点混淆。 我在pg-go 仓库中找到了这段代码,不知道为什么这样声明。请解释一下用这种方式声明变量的用例是什么。 问题答案: 这在运行时不会执行任何操作,但是除非类型满足接口要求,否则编译将失败。这是一种静态断言。

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