对象内存模型[3]线程

【参考链接】

 

我们在启动线程的时候,也经常使用匿名内部类的方式,那么此时内存的状态是怎样的呢?

以如下代码为例

 

 

已经加了断点,在Eclipse中启动调试,两个线程都停在了加断点的地方

 

在main线程中,有main()方法的栈帧,其中有两个局部变量,String[0]类型的args和Test类型的t。 (因为main()方法是静态的,所以没有局部变量this)

 

 

在Thread-0线程中,有匿名内部类.run()方法的栈帧。其中有两个局部变量,匿名内部类Test$1类型的this和float类型的f(因为是非静态的所以有this)

并且this对象的结构如下

 

说明如上一节的匿名内部类所讲,会自动为这个匿名内部类添加成员变量:this$0、val$arg1、val$v1

在创建这个匿名内部类的对象的时候,将外部对象赋值给this$0,将所在的外部类方法中的局部变量赋值给val$arg1、val$v1。

然后以这个run()方法作为新线程的启动方法

 

总结来说就是

虽然run()方法没有参数,但是其作为非static方法有默认有一个局部变量指向其匿名内部类对象,而这个匿名内部类对象中又有成员指向外部类对象,有成员赋值自所在方法的局部变量。

 

经常会直接在run()方法中访问外部类的对象类型成员变量,此时原线程、子线程就都是在访问同一个对象,可能导致并发问题。

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值