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

fre*_*ing 11 java static multithreading static-methods

关于静态的东西:

  • 类共享静态方法的实例

类似的问题:

我很困惑:

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

sco*_*ttb 11

我很困惑:

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

staticJava中的关键字仅表示"不考虑或了解对象的任何特定实例".

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

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

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

这根本与内存块无关.它只与访问有关.通过引用访问对象实例.如果引用是线程限制的,那么该引用指向的对象将始终是线程安全的.但任何可以访问您的类的线程都可能会访问其静态成员,因为不需要引用实例来使用它们.

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


You*_*ice 8

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

不,方法没有内存块.执行这些方法的线程可以.每个线程在堆栈上都有自己的内存,它存储所有方法参数和变量.

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

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


Nat*_*hes 5

每个线程都有自己的堆栈空间,每次线程调用一个方法(静态或虚拟)时,调用该方法分配一个包含本地变量的堆栈框架。对此,没有什么是静态方法特有的。

静态方法可以由多个线程并发调用,除非您专门进行了一些操作来阻止这样做,例如要求调用者获得锁(例如,使用synced关键字)。

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

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