java线程的堆空间共享_java – 为什么线程共享堆空间?

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

>您认为理所当然的方法是共享内存:除了具有令人信服的理由是线程特定的数据(如堆栈)之外,所有数据都可以被所有线程访问。基本上有一个共享堆。这给你的速度:任何时候一个线程改变一些数据,其他线程可以看到它。 (限制:如果线程正在不同的处理器上执行,这是不正确的:程序员需要非常努力地正确有效地使用共享内存)。大多数主要的命令式语言(尤其是Java和C#)都倾向于使用该模型。

每个线程可以有一个堆,加上一个共享堆。这要求程序员决定哪些数据放在哪里,而且通常不能与现有的编程语言联网。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值