黑马程序员技术交流社区

标题: 线程共享数据的一个问题 [打印本页]

作者: 周刚    时间: 2012-6-27 14:30
标题: 线程共享数据的一个问题
下面是毕老师11天13集视频里的一个截图:
ticket变量“不加static在堆里面是共享数据,加static 在方法区里面是共享数据”有点不懂,求教。。。

QQ截图20120627142652.jpg (42.61 KB, 下载次数: 43)

QQ截图20120627142652.jpg

作者: 李文龙    时间: 2012-6-27 14:38
首先,楼主你的问题ticket变量“不加static在堆里面是共享数据,加static 在方法区里面是共享数据”错啦,毕老师的视频里面说的很清楚 加static在堆内存中的共享数据,不加static 在方法区里面是共享数据  
至于理解,其实很简单,static 变量是类变量,在程序运行的时候加载到堆内存中,为类的所有对象所共享,当程序退出运行的时候,才会释放内存空间, 而没有static修饰的变量就是局部变量,只在方法运行的时候会被创建,也就是加载到 栈内存中,当方法执行完毕,所占有的内存空间就会被释放掉,只在方法区才会有用,不像static修饰的是整个程序都有效的
作者: 邵阳    时间: 2012-6-27 14:46
l楼主搞错了吧,加static是在数据区内共享数据,定义的是静态变量,也叫类变量。
不加static有两种存储路径,若是方法或者函数则储存在方法区里面,若是数据则储存在堆内存中。
另外楼主可以先判断变量属于什么类型。如果加static就是类变量,一定存储在共享区内。
如果是实例变量,就存储在堆内存中。
如果是局部变量,就存储在栈内存中。
作者: 周刚    时间: 2012-6-27 14:54
李兄,谢谢你的回答。我又证实了一遍,毕老师是面是这样讲的“不加静态时ticket堆内存中是共享数据,加static时在方法区中是共享数据”,
我上面文字描述是对的,但图片上的文字写反了,你也弄错了。
   不加static时,只有new了一个Ticket对象才会有ticket变量,又因为new出来的对象都是放在堆内存里面,
所以说不加static 时ticket是在堆中的共享数据;
  加了static 的数据放在方法区中:常量池在方法区中,和堆不是相同的概念。不要把常量池和堆混起来。
按照Inside the java virtual machine这本书上的说法,static的数据放在方法区中。



作者: 李文龙    时间: 2012-6-27 14:59
流动的阳光 发表于 2012-6-27 14:54
李兄,谢谢你的回答。我又证实了一遍,毕老师是面是这样讲的“不加静态时ticket堆内存中是共享数据,加stat ...

:handshake谢谢,我一眼看到图片上的文字,就给答了,倒让你见笑了,看来我对堆内存和栈内存的理解还不够深入,有待进一步的加强




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2