对象内存模型[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()方法中访问外部类的对象类型成员变量,此时原线程、子线程就都是在访问同一个对象,可能导致并发问题。

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java内存模型(Java Memory Model,JMM)定义了Java程序在多线程环境下的内存访问规则。它规定了线程如何和主内存、本地内存以及其他线程进行通信。 JVM内存模型是指Java虚拟机(Java Virtual Machine,JVM)在执行Java程序时的内存布局和管理方式。JVM内存模型包括了堆内存、栈内存、方法区、直接内存等。 在Java内存模型中,主要有以下几个概念: 1. 主内存:所有线程共享的内存区域,包含了实例字段、静态字段以及数组元素。 2. 工作内存:每个线程独立的内存区域,包含了该线程使用的变量副本或者缓存。 3. 内存间的交互操作:线程之间通过读写主内存来进行通信。 4. 原子性、可见性和有序性:JMM保证了原子性(对基本类型的读写操作具有原子性)、可见性(一个线程对主内存的修改对其他线程是可见的)和有序性(在一个线程中,按照程序顺序执行)。 JVM内存模型主要包括以下几个部分: 1. 堆内存:用于存储对象实例,由垃圾回收器进行管理。 2. 栈内存:用于存储方法的局部变量和方法调用的信息。每个线程都有自己的栈内存。 3. 方法区:用于存储类的信息、常量、静态变量等。 4. 直接内存:在堆外分配内存,不受JVM管理,由操作系统进行管理。 需要注意的是,JVM内存模型是具体实现的一种规范,可以根据不同的JVM厂商进行优化和调整。而Java内存模型是Java语言规范中定义的多线程内存访问规则,对于不同的JVM实现都是一样的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值