java - 为什么线程共享堆空间?

标签 java multithreading concurrency heap-memory

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

每个人都清楚,堆栈用于本地/方法变量,而堆用于实例/类变量。

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

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

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

最佳答案

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

  • 您似乎认为理所当然的方法是共享内存:除了有令人信服的理由是线程特定的数据(例如堆栈)之外,所有数据都可以访问所有线程。基本上,有一个共享堆。这为您提供了速度:任何时候线程更改某些数据,其他线程都可以看到它。 (限制:如果线程在不同的处理器上执行,则情况并非如此:程序员需要特别努力地工作以正确有效地使用共享内存。)大多数主要的命令式语言,尤其是 Java 和 C# ,赞成这种模式。

    每个线程可以有一个堆,外加一个共享堆。这需要程序员决定将哪些数据放在哪里,而这通常与现有的编程语言不能很好地融合。

  • 双重方法是消息传递:每个线程都有自己的数据空间;当一个线程想要与另一个线程通信时,它需要显式地向另一个线程发送消息,以便将数据从发送者的堆复制到接收者的堆。在这种情况下,许多社区更喜欢调用线程进程。这给了你安全:因为一个线程不能随心所欲地覆盖其他线程的内存,所以可以避免很多错误。另一个好处是分布式:您可以让您的线程在不同的机器上运行,而无需更改程序中的任何一行。您可以找到大多数语言的消息传递库,但集成往往不太好。理解消息传递的好语言是ErlangJoCaml .

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

关于java - 为什么线程共享堆空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3318750/

相关文章:

java - jnlp无法启动swt应用程序

java - 将默认字符集更改为 UTF-8

java - 如何访问另一个类中定义的线程?

c# - 只有多个线程之一执行特定代码路径

java - 如何减少使用 randomUUID( ) 生成的 UUID 的长度

javascript - 有没有办法从后面调用 .jsp 中的函数?

带有函数访问的全局共享变量的 C++ volatile 关键字

json - 并发解析 JSON - panic of runtime error(解码相关)

Java,volatile也会保证可见性吗?

database - 可以同时从多个程序打开和访问 berkeley 数据库吗?