哪些是线程私有的?
线程实际上一个个函数的执行过程,函数执行过程中的信息保存在栈帧中,一个个栈帧构成栈区,程序执行过程中需要寄存器来存中间变量,还需要一个程序计数器,指向下一条执行的指令;线程所属栈区、程序计数器以及函数运行时所需的寄存器是线程私有的,称为线程上下文 thread context。
哪些是线程共享的?
堆区
Java 程序中 new 出来的对象就放在这里,只要有该对象的指针,其他线程也可以访问该对象。(Java中的引用传递就是传递对象的引用,而简单数据类型在栈区分配,只能值传递)
已打开的文件
线程打开的文件资源是挂在进程上的,线程销毁后文件资源不会自动回收,这就是为什么打开的文件要及时关闭的原因。
动态链接库
源代码编译为目标代码后需要经过链接才能成为可执行文件(Windows中的exe文件,Linux中的ELF文件),链接时有动态链接和静态链接,静态链接就是将所有机器指令全部打包到可执行文件中,动态链接则是在运行时再找动态库中的机器指令。这些动态链接库是线程共享的。
代码区
代码区存放的是机器指令,源代码编译后成为的机器指令就放在这里,所有的线程共享代码区,也就是说没有特定的函数只能被某个线程执行。
数据区
数据区中方的是全局变量,Java中static修饰的变量就放在这里。