为什么线程共享堆空间?
每个线程都有自己的堆栈,但是它们共享一个公共堆。
所有人都清楚堆栈是用于局部/方法变量,堆是用于实例/类变量。
在线程之间共享堆有什么好处。
有多个线程同时运行,因此共享内存可能导致诸如并发修改,互斥等开销的问题。堆中的线程共享哪些内容。
为什么会这样呢?为什么每个线程也不拥有自己的堆?谁能提供一个现实的例子,线程如何利用共享内存?
回答:
要将数据从一个线程传递到另一个线程时该怎么办?(如果您从未这样做过,那么您将编写单独的程序,而不是一个多线程程序。)有两种主要方法:
- 您似乎理所当然的方法是 :除了有令人信服的理由要特定于线程的数据(例如堆栈)外,所有数据都可以被所有线程访问。基本上,有一个共享堆。这样可以 :只要一个线程更改某些数据,其他线程就可以看到它。(限制:这个,如果线程在不同的处理器上执行的是不正确的:有程序员需要工作尤其难以正确地使用共享内存 和 高效率。)大多数主要命令式语言,特别是Java和C#,青睐这种模式。
每个线程可能有一个堆,再加上一个共享堆。这要求程序员决定将哪些数据放入何处,而这往往与现有的编程语言不能很好地融合在一起。
- 双重方法是 :每个线程都有自己的数据空间;每个线程都有自己的数据空间。当一个线程想要与另一个线程通信时,它需要显式地向另一个线程发送一条消息,以便将数据从发送者的堆复制到接收者的堆。在这种情况下,许多社区都喜欢调用线程进程。这可以为您提供 :由于一个线程一时无法覆盖其他线程的内存,因此避免了很多错误。 另一个好处是:您可以使线程在不同的计算机上运行,而无需在程序中更改一行。您可以找到适用于大多数语言的消息传递库,但是集成往往不太好。理解消息传递的良好语言是Erlang和JoCaml。
实际上,消息传递环境通常至少在后台使用共享内存,只要线程在同一台计算机/处理器上运行即可。这节省了大量时间和内存,因为从一个线程向另一个线程传递消息就不需要复制数据了。但是由于共享内存没有暴露给程序员,因此其固有的复杂性仅限于语言/库的实现。
以上是 为什么线程共享堆空间? 的全部内容, 来源链接: utcz.com/qa/430957.html