Java线程数据共享限制解析

进程之间是相互独立的,无法看到各自的地址空间。但是对于线程而言,就不一样了,进程是承担系统资源的基本单位,线程是承担进程资源以及被调度的基本单位。

一个PCB代表一个线程,而线程的空间来自于进程分出的一小部分资源,对应了上面说的“线程是承担进程资源的基本单位”,这样的话,因为是承担了同一个进程的资源,所以有一部分资源是线程间可以相互看到的!!那么到底哪些内容是可以“共享”的呢??

java线程不可以共享数据 线程不能共享的是_运行时间



一、不能共享的

原则上来说,大部分内容应该是可以共享的,了解了不能共享的,剩下的就是可以共享的内容了。这里主要了解一些听说过的内容。



1、栈区

即便是承担进程资源,唯独栈区不能分你一点,下面就列举出几种情况。


1) 函数调用

函数被调用的时候,要在栈上建立栈帧,此时函数的地址、函数的返回值、维护函数栈帧的寄存器(esp、ebp)都是私有的。栈上可能写了一些你自己定义的函数,如果其他线程能看到,岂不是相当于可以让一个陌生人随意拿你的东西。


2) CPU指令执行

CPU执行指令的信息保存在一个叫做程序计数器的寄存器中,每一条语句都有对应的地址,当线程的运行时间到了,线程就要排到运行队列的末尾等待,CPU在执行指令的时候,通过这个程序计数器的值可以知道上一次执行到哪个地方了。

2、调度优先级

线程既是承担进程资源的基本单位,也是被调度的基本单位。最开始我们也说了,一个线程可以看作是一个PCB,而在运行队列中轮流运行的就是PCB,一个PCB的运行时间到了,就要排到末尾。然而,一般谁先被调用,谁后被调用,是要根据优先级而定的,这个优先级决定了哪个线程先被调用。

java线程不可以共享数据 线程不能共享的是_java线程不可以共享数据_02



3、上下文数据

当PCB的运行时间到了以后,此时就要排到运行队列的末尾。那么运行过程中产生的 大量临时数据以及 CPU暂停运行的位置信息,我们统称为上下文数据。




二、可以共享的

这个相比之下就很好判断了,虚拟内存地址空间可以被分成多个部分。除了栈区不能被共享外,堆区、全局区、代码区都是可以被共享的!除此之外,加载到内存的动态链接库也是可以被共享的!比如线程库pthread,就是放在了栈区和堆区中间的位置

java线程不可以共享数据 线程不能共享的是_运行时间_03

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空