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

关于静态的东西:

  • 类共享静态方法的实例

类似的问题:

我感到困惑:

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

答案 1

我感到困惑:

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

Java中的关键字只是意味着“不考虑或了解对象的任何特定实例”。static

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

在多线程处理中,线程安全涉及保护可变数据的一致性和完整性。由于对象封装了其实例字段的状态,因此在多个线程将访问同一对象的情况下,实例方法只需要关注线程安全。

因此,虽然对象的线程限制是类实例的有效线程安全策略,但这种相同的推理对于静态方法无效,因为它们没有实例。

这与内存块完全无关。它只是与访问有关。对象实例是通过引用访问的。如果引用是线程限制的,则该引用点将始终是线程安全的。但是,任何可以访问类的线程都可能访问其静态成员,因为不需要引用实例即可使用它们。

默认情况下,静态方法不受阻止。您可以实现自己的同步/线程安全策略,并根据需要使用静态方法块。


答案 2

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

静态方法可以由多个线程并发调用,除非您专门执行某些操作来阻止它,例如要求调用方获取锁(例如使用 synced 关键字)。

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

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


推荐