- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解 Java(和 JVM)如何在幕后创建线程。
我阅读了《Java 并发实践》,但我找不到关于默认情况下所有 Java 应用程序都是单线程还是多线程的良好解释。
一方面,从开发人员的角度来看:我编写了一堆顺序代码,但没有创建 Thread 实例或在任何地方实现 Runnable。我需要同步什么吗?我应该双重确保我的类是线程安全的吗?如果是这样,我应该停止使用具有可变字段的 POJO 吗?我读到,JVM 会在幕后为自己的业务创建多个线程。 JVM 是否也会创建线程来运行我的应用程序,而无需我显式创建这些线程?
另一方面:我编写了一堆代码,在其中显式创建了 Threads 和 Runnable 实现。 JVM 是否会分离出自己的线程来“帮助”我的多线程代码运行得更快?
完全有可能我什至没有以正确的方式考虑 JVM 的线程处理。但是,我是一名入门级 Java 开发人员,我讨厌这种困惑。
最佳答案
On the one hand, from the POV of a developer: I write a pile of sequential code without creating Thread instances or implementing Runnable anywhere. Do I need to synchronize anything? Should I be making double-sure my classes are thread-safe? If so, should I stop using POJOs that have mutable fields?
简单的答案是不,您不需要主动使对象成为线程安全的以保护它们免受非您创建的线程的并发访问。
一般来说,与您编写的代码和类并发交互的线程1不会被创建,除非您自己做了一些已知会创建线程的事情,然后您组织共享一个线程之间的对象实例。创建Thread
对象是创建线程的一个示例,但还有其他示例。以下是一个非详尽列表:
Executor
或 ExecutorService
实现。Stream
方法,例如,通过使用 parallelStream
方法创建流。因此,一般来说,线程不会凭空出现,而是由于您所做的事情而产生的。即使一个库创建了您不知道的线程,您也不必担心,因为除非另有记录,否则它们将不会访问您的对象,或者将使用锁定来确保它们以序列化方式访问它们(或者库严重损坏)。
因此,您通常不需要担心跨线程同步,除非您知道正在使用线程的地方。因此,默认情况下,您不需要使对象成为线程安全的。
1 我对“与您编写的代码进行交互”进行了区分,因为典型的 JVM 会在幕后使用多个线程,即使您从未自己创建任何线程,以执行诸如垃圾之类的内务处理任务集合、调用终结器、监听 JMX 连接等等。
关于java - 除非程序员显式创建线程或 Runnable 的实现,否则所有 Java 应用程序都是单线程的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57024175/
我是一名优秀的程序员,十分优秀!