关于静态的东西:
- 类的实例共享静态方法
类似的问题:
我很困惑:
- 静态方法只有一个内存块?
- 如果我在多线程中使用静态方法,它会阻塞吗?
原文由 freeeze king 发布,翻译遵循 CC BY-SA 4.0 许可协议
关于静态的东西:
类似的问题:
我很困惑:
原文由 freeeze king 发布,翻译遵循 CC BY-SA 4.0 许可协议
每个线程都有自己的堆栈空间,每次线程调用一个方法(静态或虚拟)时,调用都会分配一个堆栈帧,其中包含局部变量。这与静态方法无关。
静态方法可以由多个线程并发调用,除非您专门做一些事情来阻止它,例如要求调用者获取锁(例如使用 synchronized 关键字)。
静态方法适用于没有共享状态的情况。在访问或修改线程安全共享状态的情况下,它们可能没问题,这取决于需要什么级别的并发以及被访问的线程安全事物的效率。
留意瓶颈。将 synchronized 关键字放在静态方法上可能会出现问题,因为这会限制您的应用程序一次只能用一个线程调用它。替代策略包括使用原子对象、使用为高并发性设计的线程安全数据结构或使用线程限制可能比锁定更可取。
原文由 Nathan Hughes 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
Java 中的
static
关键字仅表示“不考虑或不了解对象的任何特定实例”。实例方法可以使用
this
访问其关联实例的字段,但是静态方法没有关联实例,因此this
没有意义。在多线程中,线程安全涉及保护可变数据的一致性和完整性。因为对象封装了它们的实例字段的状态,所以在多个线程访问同一个对象的情况下,实例方法只需要关心线程安全。
因此,虽然对象的线程限制是类实例的有效线程安全策略,但同样的推理对静态方法无效,因为它们没有实例。
这与内存块完全无关。它只与访问有关。通过引用访问对象实例。如果引用是线程限制的,那么该引用指向的对象将始终是线程安全的。但是可以访问您的类的任何地方的任何线程都可能访问其静态成员,因为不需要引用实例即可使用它们。
静态方法默认是非阻塞的。您可以实现自己的同步/线程安全策略,并根据需要阻止静态方法。