黑马程序员技术交流社区

标题: 有关新建对象的疑问 [打印本页]

作者: 陈祥厅    时间: 2013-1-8 23:43
标题: 有关新建对象的疑问
本帖最后由 陈祥厅 于 2013-1-9 10:04 编辑

Single s=new Single;
Single s=new Single;       如果程序中接连着有2次这样的语句建的是2个对象么,如果是在内存里是啥样的
--------------------------------------------------我是分割线----------------------------------------------

其实我是想问这个懒汉式在多线程的时候不是说会可能在-->A  -->B这里A和B都可能停在这么,然后A又开始了并创建了一个对象,接着B又活了又创建一个对象,这样创建出来是怎么样的2个对象,都叫s?也不对啊

作者: 罗利华    时间: 2013-1-9 00:01
本帖最后由 修心者 于 2013-1-9 00:05 编辑

首先当你使用new关键字创建对象时。
Single s = new Single();
当执行这句结束后,
在栈空间中会有一个变量s,
那么在堆空间中会有一个Single对象,
变量s则指向这个对象。

a.png (8.26 KB, 下载次数: 36)

a.png

作者: 金鑫    时间: 2013-1-9 00:07
你这个问题都不好说什么,每期论坛的开版帖子中,关于提问都有明确要求,希望好好看一下。
曾经有童鞋对于版主审核提问提出过一些疑问,我想说的是版主也不是天生就会,也要自己一点点学得。所以对于哪些问题是应该问的,可以问的,哪些不可以都心理有数,希望最好不要再出现这种水题贴子
作者: 奋斗的青春    时间: 2013-1-9 00:09
我是来看老方的{:soso_e136:}
作者: 黑马斯巴达    时间: 2013-1-9 00:20
不能两次都 定义这个s的吧。。换一个变量名 那就是两个对象啦
Single s=new Single();
Single f=new Single();
作者: 李培根    时间: 2013-1-9 08:47
吴愿涛 发表于 2013-1-9 00:09
我是来看老方的

哪里有老方?
作者: 李培根    时间: 2013-1-9 08:50
这种情况会报错的,变量名相同。

Single s=new Single();
Single ss=new Single();
只要是new就会在堆内存产生不同的对象。
作者: 陈祥厅    时间: 2013-1-9 09:14
本帖最后由 陈祥厅 于 2013-1-9 09:40 编辑
金鑫 发表于 2013-1-9 00:07
你这个问题都不好说什么,每期论坛的开版帖子中,关于提问都有明确要求,希望好好看一下。
曾经有童鞋对于 ...


其实我是想问这个懒汉式在多线程的时候不是说会可能在-->A  -->B这里A和B都可能停在这么,然后A又开始了并创建了一个对象,接着B又活了又创建一个对象,这样创建出来是怎么样的2个对象,都叫s?也不对啊

作者: 舒远    时间: 2013-1-9 09:22
人家贴图的代码哪里有问题?没明白人家提问的关键点,就说人家问的不好。实际是你们自己不懂而已!
回答:
当多线程情况下,代码s = new Single();可能会被多次执行,产生并发问题的原因就是楼主你自己说的,A和B线程都有可能进入到s = new Single();的代码部分,这样后进入的线程创建的对象就将前一个创建的对象给覆盖掉了。前一个对象会被垃圾回收,栈中没有引用指向它。
就针对你当前的代码来看,创建的两个对象实质是一样的,只不过内存中曾经产生过两个Single的实例,这与单例的思想就不符合了。

作者: 陈祥厅    时间: 2013-1-9 09:45
舒远 发表于 2013-1-9 09:22
人家贴图的代码哪里有问题?没明白人家提问的关键点,就说人家问的不好。实际是你们自己不懂而已!
回答:
...

哦哦~晓得了~~~~是我原来问问题的方式不对不是他们不懂~分割线以下的问题是后来补上的:P
作者: 金鑫    时间: 2013-1-9 11:00
舒远 发表于 2013-1-9 09:22
人家贴图的代码哪里有问题?没明白人家提问的关键点,就说人家问的不好。实际是你们自己不懂而已!
回答:
...

他的图是今天加上去的,昨天提问的问题时候确实不对,不然老方也不会发飙了




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