❶ java里,栈有一个很重要的特殊性,就是存在栈中的数据可以共享,这是什么意思

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。
引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。
这些东西都在虚拟机内部完成,我们不需要操作,你知道是怎么回事就可以了。

❷ 多线程可以共享堆栈吗为什么

1)【Windows线程模】
在Windows,每个线程各自拥有自己的堆栈,且线程的堆栈式不可共享的!这是由Windows线程模型决定的,用户不可改变。
2)【应用程序的堆(Heap)】
在一个多线程结构的应用程序中,堆HEAP中的对象、变量可以被多个线程共享。

❸ linux 线程的内核栈是独立的还是共享父进程的

首先,我们知道所有线程共享主线程的虚拟地址空间(current->mm指向同一个地址),且都有自己的用户态堆栈(共享父进程的地址空间,再在里面分配自己的独立栈,默认2M)。这是毫无疑问的,但还有一点我没搞明白,内核栈是共享还是独立的?猜测:独立的。理由:要不然内核栈对应的thread_info中的tast_struct没有办法与每个线程对应起来,因为现在已经有多个task_struct了,但保存内核栈的thread_info(其实是thread_union联合体)中只能保存一个task_struct。所以理论上分析,虽然可以共享地址空间,但每个线程还是需要一个单独的内核栈的。看代码:分析创建线程最终肯定会走到内核函数do_fork()中来的,所以从此函数看起。do_fork()->_process()->p_task_struct()fork.c中p_task_struct()的实现:static struct task_struct *p_task_struct(struct task_struct *orig){struct task_struct *tsk;struct thread_info *ti;unsigned long *stackend;int node = tsk_fork_get_node(orig);int err;tsk = alloc_task_struct_node(node);if (!tsk)return NULL;ti = alloc_thread_info_node(tsk, node);/*就是这里,果然分配内核栈了*/if (!ti)goto free_tsk;err = arch_p_task_struct(tsk, orig);/*这里分配task_struct结构*/if (err)goto free_ti;tsk->stack = ti; ...}

❹ 两台电脑它们的操作系统不同,可不可以共享一台打印机

可以,只要在同一局域网就可以操作
方法还是挺简单的,可以按照以下步内骤操作:
第一、将打印机容和其中一台电脑连接,一般打印机都有一个连接电脑的线,一般是USB口的。
第二、打印机和电脑连接以后,一般会提示安装驱动,这个按提示操作即可。
第三、连接完以后,在开始菜单里找到打印机和传单,进去以后可以找电脑连接的打印机,完了右键,选择共享。
第四、查看一下连接你打印机电脑的IP地址,(右键点击网上邻居,选择属性-网络-Internet协议,进行查看)
第四、在另一台电脑的开始-运行里输入\\***.***.***.***(连接打印机电脑的IP地址),确定即可弹出之前那个电脑共享的打印机图标,然后右键,选择连接即可。
注:要达到共享的功能,两台电脑需在同一个局域网里才可以实现。