当前位置: 首页 > 面试题库 >

为什么线程共享堆空间?

蒋正平
2023-03-14
问题内容

每个线程都有自己的堆栈,但是它们共享一个公共堆。

所有人都清楚堆栈是用于局部/方法变量,堆是用于实例/类变量。

在线程之间共享堆有什么好处。

有多个线程同时运行,因此共享内存可能导致诸如并发修改,互斥等开销的问题。堆中的线程共享哪些内容。

为什么会这样呢?为什么每个线程也不拥有自己的堆?谁能提供一个现实的例子,线程如何利用共享内存?


问题答案:

要将数据从一个线程传递到另一个线程时该怎么办?(如果您从未这样做过,那么您将编写单独的程序,而不是一个多线程程序。)有两种主要方法:

  • 您似乎理所当然的方法是 共享内存 :除了有令人信服的理由要特定于线程的数据(例如堆栈)外,所有数据都可以被所有线程访问。基本上,有一个共享堆。这样可以 提高速度 :只要一个线程更改某些数据,其他线程就可以看到它。(限制:这个,如果线程在不同的处理器上执行的是不正确的:有程序员需要工作尤其难以正确地使用共享内存 高效率。)大多数主要命令式语言,特别是Java和C#,青睐这种模式。

每个线程可能有一个堆,再加上一个共享堆。这要求程序员决定将哪些数据放入何处,而这往往与现有的编程语言不能很好地融合在一起。

  • 双重方法是 消息传递 :每个线程都有自己的数据空间;每个线程都有自己的数据空间。当一个线程想要与另一个线程通信时,它需要显式地向另一个线程发送一条消息,以便将数据从发送者的堆复制到接收者的堆。在这种情况下,许多社区都喜欢调用线程进程。这可以为您提供 安全性 :由于一个线程一时无法覆盖其他线程的内存,因此避免了很多错误。 分发的 另一个好处是:您可以使线程在不同的计算机上运行,​​而无需在程序中更改一行。您可以找到适用于大多数语言的消息传递库,但是集成往往不太好。理解消息传递的良好语言是Erlang和JoCaml。

实际上,消息传递环境通常至少在后台使用共享内存,只要线程在同一台计算机/处理器上运行即可。这节省了大量时间和内存,因为从一个线程向另一个线程传递消息就不需要复制数据了。但是由于共享内存没有暴露给程序员,因此其固有的复杂性仅限于语言/库的实现。



 类似资料:
  • 问题内容: 我正在观看有关Java的演示,有一次讲师说: “可变性还可以,共享很好,共享可变性是魔鬼的工作。” 他指的是以下代码,他认为这是“极度坏习惯”: 然后,他着手编写应使用的代码,即: 我不明白为什么第一段代码是“不良习惯”。对我来说,他们都实现了相同的目标。 问题答案: 当执行并行处理时,该问题就起作用了。 在使用流时,这不必要地使用了 副作用, 但如果正确使用,并非所有副作用都不好,因

  • 我正在看一个关于Java的演讲,有一次,讲师说: “可变是可以的,共享是好事,共享可变是魔鬼的工作。” 他所指的就是以下代码,他认为这是一个“极其糟糕的习惯”: 然后,他继续编写应该使用的代码,即: 我不明白为什么第一段代码是“坏习惯”。对我来说,他们都达到了相同的目标。

  • 本文向大家介绍什么是秘密共享?相关面试题,主要包含被问及什么是秘密共享?时的应答技巧和注意事项,需要的朋友参考一下 回答:秘密共享是用于在区块链中提供数据安全性的主要方法之一。这种方法将个人信息或机密信息分为不同的单元,然后将其发送给网络上的用户。原始信息共享给分配了秘密共享的参与者。

  • 我有一个文件,它创建了两个实例,一个用于,另一个用于。 当我运行时,我会得到这样的输出: 如果我运行: 我看到两个服务共享。在我的中,我设置了: 在创建前运行一些

  • 问题内容: 我在Java Web应用程序中有一个线程,它导致 java.lang.OutOfMemoryError:Java堆空间 异常,但是try / catch块无法捕获该错误。 样例代码: 输出: 背景: 我最近接手了这个Java项目,并试图跟上Java和这个项目的发展。我是C#开发人员,所以我还不熟悉这个项目或Java。我知道我可以使用- Xmx设置来修复该错误,但我有兴趣捕获此错误,因此

  • 我知道如何使用-Xss为java线程设置堆栈大小,我们在产品中使用它。 但是当我们的应用程序中使用了很多线程,并且设置了-Xss(我们设置为512k我们的使用)。我们会遇到错误报告无法创建新的本机线程。它应该与堆栈大小有关,因为当我们设置-Xss256k时,错误消失了。 我的问题是对于1个线程,Xss设置堆栈大小,但是对于所有线程,堆栈大小如何<整个线程的总堆栈内存大小的限制是什么?我没有发现这样