2 guotong1988 guotong1988 于 2014.11.24 14:58 提问

java 线程共用代码段吗?

java的线程里run方法里的代码段,new几个Thread类一块运行时,内存中只有一套代码吧?

4个回答

pujianhua
pujianhua   2014.11.24 17:04

方法代码段在类加载的时候放入方法区中,只有一套代码。new几个Thread类,run实际是指向方法区的同一代码块。

magi1201
magi1201   2014.11.24 15:01

都在内存中,由操作系统给每个线程分配时间片,分到时间片的,就开始自己的任务执行,时间片用完了,那让别人执行

magi1201
magi1201 回复guotong1988: 这么理解吧:多线程在单核情况下,多个线程争取那一个处理器的执行资源;多核处理器,那么线程有多个争取的目标,这样对于线程来说,执行的等待时间就比单核少了很多,整体效率就快了
3 年多之前 回复
guotong1988
guotong1988 回复magi1201: 如果是多核的话,如果有4核,那是不是内存中有4套代码比较快?
3 年多之前 回复
magi1201
magi1201 回复guotong1988: 一套,一个线程它可以在多个处理器上面去抢资源,在哪里抢到了,就在哪里执行
3 年多之前 回复
guotong1988
guotong1988 回复magi1201: 代码都在内存中——意思是一套还是几套?
3 年多之前 回复
magi1201
magi1201 回复guotong1988: 多核处理器,线程可以认为是并行的,可以按照有多个单核的情况来处理。代码都在内存中,线程的执行只是抢占时间片的问题。
3 年多之前 回复
guotong1988
guotong1988 如果是多核的话?
3 年多之前 回复
guotong1988
guotong1988 意思是有几套代码在内存中?
3 年多之前 回复
caozhy
caozhy   Ds   Rxr 2014.11.24 15:36

对于冯诺依曼架构的计算机(包括x86),内存既存储代码,也存储数据。代码当然只要一份就够了。你说的应该是指数据,数据分为堆栈和堆两部分,每个线程拥有自己的堆栈,但是共享堆存储。每个进程则拥有完全隔离的堆存储。

eagleyan
eagleyan   Rxr 2014.12.01 04:38

Java VM的代码放在方法区,在class被load的时候load到内存里面。所以代码时只有一套的。
而new几个Thread,他们各自有自己的栈区,局部变量放在栈区。这个不是共享的。至于你问到,多核状态下,4套代码是不是更快,其实cpu的预取的确会把一部分代码取到它的cache里,也就是代码会在cache里可能重复(假设你同时正好在运行几个相同的Thread)。但是这个不是Java VM做的,而是现代的CPU都是这么做的。虚拟机本身只是一个栈操作的应用程序,它并不会操作cache。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!