首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一文搞定JMM核心原理

所有具有对象引用线程都可以访问堆上对象。当一个线程有权访问一个对象时,它也可以访问该对象成员变量。...如果两个线程同时在同一个对象上调用一个方法,它们都可以访问该对象成员变量,但每个线程都有自己局部变量副本。 两个线程有一组局部变量。其中一个局部变量(局部变量2)指向堆上共享对象(对象3)。...注意共享对象(对象3)如何将对象2和对象4作为成员变量引用(由对象3到对象2和对象4箭头所示)。通过对象3中这些成员变量引用,两个线程可以访问对象2和对象4....理论上,如果两个线程都引用了两个对象,则两个线程都可以访问对象1和对象5。但是在上图中,每个线程只引用了两个对象中一个。 线程栈访问堆示例 那么,什么样Java代码可以导致上面的内存图?...因此,localVariable2两个副本最终都指向静态变量指向MySharedObject同一个实例。MySharedObject实例也存储在堆上。它对应于上图中对象3。

10010
您找到你想要的搜索结果了吗?
是的
没有找到

【PYTHON】论Python类中私有变量、共有变量、全局变量局部变量

这里就拿引言中参考代码进行举例说明。  从代码中我们可以看到,我们在类中定义了5个变量,当私有、共有,局部、全局都有。...但是如果我们对该类进行实例化之后,我们可以查看该类被实例化之后对象参数,截图如下:  从截图中,我们可以看到,对象f能够直接引用类中全局变量fly,但是在对象f__dict__对象中并没有存放该全局变量...我们在截图中可以看到,在f__dict__中,存放了两个私有变量键值对,但是对于双下划线私有变量而言,它名字较之我们定义时名字还是有所区别。...我们可以通过这种方式对其进行访问实例如下:  1.2 局部变量  局部变量,是指该变量生命周期不会和程序全部生命周期同步生存或者死亡。...上面的截图中,在类中run()方法中定义r变量是一个局部变量,我们根本不可能调用它,因为它在run()方法运行完毕之后,属于它局部变量r)那一块内存空间就会被Python解释器给释放掉,所以Python

4.1K20

【JavaScript】作用域 ① ( JavaScript 作用域 | 全局作用域 | 局部作用域 | JavaScript 变量 | 全局变量 | 局部变量 )

名称 生效代码范围 就是 " 作用域 " ; " 作用域 " 可以控制 变量 / 函数 访问性 , 即 变量 / 函数 在哪些代码区域可以被调用 , 在哪些区域不能被调用 ; 作用域 可以 提高程序...局部作用域 function add() { // 该 num 变量 和 num2 变量 都是局部变量 // 这两个变量只能在 函数内部可以访问...而直接赋值使用变量 , 也是 局部变量 ; 2、全局变量局部变量 生命周期 全局变量局部变量 区别 : 全局变量 在 任何地方 都可以使用 , 在 浏览器 关闭时 被销毁 , 因此 使用全局变量...要注意 内存泄露问题 ; 局部变量 只在 函数内部使用 , 函数执行后 才初始化局部变量 , 函数执行完毕之后 局部变量 占用内存就会被释放 ; 在进行 JavaScript 编程时候 , 建议...全局变量 // 定义 num 变量在 整个 标签中都可以访问 // 该变量就是 全局变量 var num = 10;

10810

iOS底层原理总结 - 探寻block本质(一)

自动变量会捕获到block内部,也就是说block内部会专门新增加一个参数来存储变量值。 auto只存在于局部变量中,访问方式为值传递,通过上述对age参数解释我们也可以确定确实是值传递。...局部变量因为跨函数访问所以需要捕获,全局变量在哪里都可以访问 ,所以不用捕获。 最后以一张图做一个总结 ?...对象方法和类方法对比 不论对象方法还是类方法都会默认将self作为参数传递给方法内部,既然是作为参数传入,那么self肯定是局部变量。上面讲到局部变量肯定会被block捕获。...c++代码 上图中可以发现,即使block中使用实例对象属性,block中捕获仍然是实例对象,并通过实例对象通过不同方式去获取使用到属性。...block类型 通过打印内容可以发现正如上图中所示。 没有访问auto变量block是__NSGlobalBlock__类型,存放在数据段中。

1K41

Java虚拟机

1、Java虚拟机是什么 “Java虚拟机“可以指三种不同东西 抽象规范 一个具体实现 一个运行中虚拟机实例 当运行一个Java程序同时,也就是在运行一个Java虚拟机实例 2、Java虚拟机生命周期...一种可能堆空间设计就是,把堆分为两部分:一个句柄池,一个对象池。 这种设计好处是有利于堆碎片整理,缺点是每次访问对象实例变量都需要经过两次指针传递。 ?...另一种设计方式是使对象直接指向一组数据,而数据包括对象实例数据以及指向方法区类数据指针。这种设计方式优点是只需要一个指针就可以访问对象实例数据,但是移动对象就变得更加复杂。 ?...局部变量区和操作数栈大小要对应方法而定,编译器在编译器时就确定的确定了这些值并放在class文件中。帧数据区大小依赖于具体实现。...局部变量区:Java栈帧局部变量区被组织为以一个字长为单位、从0开始计数数组。字节码指令通过从0开始索引来使用其中数据。 局部变量区对应方法参数和局部变量

1.2K100

第十节(变量作用域)

本次将介绍以下内容: ●变量作用域概念及其重要性 ●什么是外部变量,为何要避免使用它们 ●局部变量细节 ●静态变量和自动变量区别 ●局部变量和块 ●如何选择存储类别 一.什么是作用域 变量作用域指的是程序中哪些部分可以访问变量...如果在该程序中添加其他函数,x变量也对它们可见(即,可以访问x变量)。 严格地说,外部变量作用域是整个程序并不准确。应该说,外部变量作用域是包含该变量定义整个源代码文件。...如果程序中只有部分函数需要访问一个变量,应将该变量作为参数传递给函数,而不是让它成为外部变量。 2.3 extern关键字 当函数使用外部变量时,最好在函数内使用extern关键字声明该函数。...x变量第1个实例在完成第1次函数调用时已被销毁。再次调用函数时,会创建一个x变量实例,原来x变量已被销毁。 如何在两次函数调用期间保留局部变量值?...更好做法是将其作为参数传递给函数不要把非数值变量、结构、数组声明为寄存器变量。 四.局部变量和main()函数: 根据前面介绍内容,main()函数和其他所有的函数都可以使用局部变量

18540

深度学习Java之内存模型【译】

局部变量可以是原生类型,这样它就完全存在了栈里面。 局部变量可以是对象引用,这种情况下对象引用也就是局部变量本身是存在栈里面的,而对象本身内容则放在堆里面。...静态变量和类定义对象一样也是放在堆里。 堆里对象可以被所有线程访问,只要这些线程有相应对象引用。线程如果可以访问一个对象,那一定就可以访问这个对象成员字段。...如果两个线程同时访问同一个对象同一个方法,那么它们会同时访问对象字段,当时每个线程都会创建属于自己局部变量。 具体请看下面这张图。 两个线程都有一些局部变量。...注意到这个共享对象3持有对象2和对象4引用作为内部成员。通过成员变量引用, 这两个线程都可以访问对象2和对象4。 图中两个线程栈里面的局部变量1分别指向了堆里不同对象。...结果就是这两个局部变量都指向同一个又静态变量指向ShareObject对象,ShareObject这个对象实例就存放在堆里,就是图中对象3。

30910

Java Review (八、面向对象----成员变量局部变量)

正是基于这个原因,可以把类变量实例变量统称为成员变量。 只要类存在,程序就可以访问该类变量。在程序中访问变量通过如下语法 类.类变量 只要实例存在,程序就可以访问实例实例变量。...在程序中访问实例变量通过如下语法: 实例.实例变量 当然,类变量 可以让该类实例访问 通过实例访问变量语法如下: 实例.类变量 但由于这个实例并不拥有这个类变量,因此它访问并不是这个实例变量...实例也可访问变量,同一个类所有实例访问变量时, 实际上访问是该类本身同一个变量,也就是说,访问了同一片内存区。 局部变量 局部变量根据定义形式不同,又可以被分为如下三种。...Java允许局部变量和成员变量同名,如果方法里局部变量和成员变量同名,局部变量会覆盖成员 变量,如果需要在这个方法里引用被覆盖成员变量,则可使用this (对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量...基于这个理由,当程序需要访问变量时,尽量使用类作为主调,而不要使用对象作为主调,这样可以避免程序产生歧义,提高程序可读性。

92110

JVM内存模型

执行引擎所运行所有字节码指令都只针对当前栈帧进行操作。 2.1局部变量局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义局部变量。...虚拟机是使用局部变量表完成参数值到参数变量列表传递过程,如果是实例方法(非static),那么局部变量第0位索引Slot默认是用于传递方法所属对象实例引用,在方法中通过this访问。...第四条指令istore_2则从操作数栈中弹出结果,并把它存储到局部变量区索引为2位置。下图详细表述了这个过程中局部变量和操作数栈状态变化,图中没有使用局部变量区和操作数栈区域以空白表示。 ?...类变量被类所有实例共享,即使没有类实例时你也可以访问它。这些变量只与类相关,所以在方法区中,它们成为类数据在逻辑上一部分。...Java 堆里面的DirectByteBuffer 对象作为这块内存引用进行操作。

53140

Java多线程编程-(10)-看了这篇关于ThreadLocal原理应该透彻了

二、ThreadLocal源码分析 1、线程局部变量在Thread中位置 既然是线程局部变量,那么理所当然就应该存储在自己线程对象中,我们可以从 Thread 源码中找到线程局部变量存储地方:...七、总结 通过源代码可以看到每个线程都可以独立修改属于自己副本而不会互相影响,从而隔离了线程和线程.避免了线程访问实例变量发生安全问题....ThreadLocal实例作为key来存储value值; (5) ThreadLocal模式至少从两个方面完成了数据访问隔离,即纵向隔离(线程与线程之间ThreadLocalMap不同)和横向隔离(...不同ThreadLocal实例之间互相隔离); (6)一个线程中所有的局部变量其实存储在该线程自己同一个map属性中; (7)线程死亡时,线程局部变量会自动回收内存; (8)线程局部变量时通过一个...前者仅提供一份变量,让不同线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。

28730

《代码未来》读书笔记:也谈闭包

这是因为:与while语句不通,Foreach循环实际上是在另一函数中执行,因此无法从函数中访问位于外部局部变量 i。...2.1 作用域(Scope)   作用域指的是变量有效范围,也就是某个变量可以访问范围。...作用域是嵌套,因此位于内侧代码块可以访问以其自身为作用域变量,以及以外侧代码块为作用域变量。   ...下图中我们将匿名函数赋值给了一个变量(当然,如果不赋值而直接作为参数传递也是可以),这个函数对象也有自己作用域: ?   ...下图中一个例子是一个返回函数对象函数extent(这个extent函数返回值是一个函数对象)。函数对象会对extent中一个局部变量n进行累加,并显示它值。

52620

Java内存区域与虚拟机类加载机制

操作数栈和局部变量表在访问方式上存在着较大差异,操作数栈并非采用访问索引方式来进行数据访问,而是通过标准入栈和出栈操作来完成一次数据访问。...1、如果使用句柄访问的话,那么Java堆中将会划出一块内存来作为句柄池,reference中存储就是对象句柄地址,而句柄中包含了对象实例数据与类型各自具体地址信息。   ...对象,作为方法区这个类各种数据访问入口。   ...首先这个时候进行内存分配仅包括类变量(被static修饰变量),而不包括实例变量实例变量将会在对象实例化时随着对象一起分配在Java堆中,其次,这里所说“初始值”通常情况下是数据类型零值。   ...在()方法中,静态语句块中只能访问到定义在静态语句块之前变量,定义在他之后变量,在前面的静态语句块可以赋值,但不能访问

72280

天下风云出我辈:Servlet

不过这是个客户端产品,作为浏览器插件而出现,applet增强了用户与浏览器之间交互体验。虽然让人眼前一亮,但却是昙花一现。...在Servlet容器(比如Tomcat)启动时候,其注册Servlet类并不会被创建出实例(new),仅当其第一次被访问时候,才会new出这个Servlet对象。...Servlet其本质也是一个普通Java类,可以定义成员变量。但是高并发时候成员变量通常会成为线程安全问题罪魁祸首。...当前这个问题解决起来十分容易,可以通过synchronized关键字来同步一个变量访问。然而这其实并不是好解法办法,更好方法是通过规范一个编码风格来规避。...比如多使用局部变量,不在Servlet中使用成员变量局部变量不方便地方,可以用ThreadLocal变量

43940

20张图助你了解JVM运行时数据区,你还觉得枯燥吗?

当一个实例方法被调用时候,它方法参数和方法体内部定义局部变量将会按照顺序被复制到局部变量表中每一个Slot上。...JVM会为局部变量表中每个Slot都分配一个访问索引,通过这个索引即可成功访问局部变量表中指定局部变量值。...如果需要访问局部变量表中一个64bit局部变量值时,只需要使用前一个索引即可。 ?...补充知识点:变量按照在类中位置可以分为成员变量局部变量,其中成员变量又分为类变量实例变量。...成员变量在使用前,都会默认初始化赋值,其中类变量是在类加载子系统准备阶段进行默认赋值,在初始化阶段显示赋值; 实例变量会随着对象创建,在堆空间中分配实例变量空间,并进行默认赋值; 局部变量是不会进行默认赋值

59440

Android(Java) | 你真的熟悉Java匿名内部类吗(Java匿名内部类限制)

,会引用外部类实例 只能捕获外部作用域内final变量 创建时只有单一方法接口可以用Lambda转换 a.匿名内部类名字 表面上是没有引用名, 但其实是有用于定位“名字”, ?...; 00 01 10 11 捕获 匿名内部类 所在方法内(外部作用域) 局部变量快照情况 匿名内部类重写父类方法时,引用到外部方法体内局部final变量 通常,要求要被捕获局部变量...需要是final修饰; 虽然说如果不final的话, 对匿名内部类构造方法也不是很有影响, 因为传给匿名内部类构造方法这个局部变量实例, 实际上只是捕获局部变量实例一个快照, 快照即复制一份引用...,给匿名内部类构造方法去使用, 但是, 如果这个局部变量实例不是final, 那局部变量实例被重新赋值了, 外部局部变量实例跟传给匿名内部类构造方法局部变量实例,就不一样了!...这个肯定是不行吧, 所以, Java要求, 这个地方(图中左边,第三行,也即被传给 匿' 构造方法 这个 局部实例)一定要是final, 原因就是为了让这个局部变量实例,在外部和在 匿’

1.7K60

西门子PLC-1200 SCL语言开发学习笔记 (一)

二、新建SCL程序块 在博图软件项目视图中,便有添加新快,双击 推荐使用FB模块,便于存放变量,语言选择SCL 三、变量创建和访问 在打开FB模块后,上方就是变量定义区 Input则是输入参数...,Output是返回值或者理解为C# out关键字输出变量,InOut则是类似Ref既输入又输出,Static变量才是我们可以保留变量,Temp 相当于方法内局部变量,这次执行过后会被重设 我们代码会被放在一个方法块内...要写代码当然要会访问各个能访问变量, FB里面定义变量用#开头来访问 访问地址用%开头, 变量表里变量相当于全局静态变量 我们给一些地址起了名字,既可以用 %I0.0 也可以用Btn1,最终都会变成...访问别的实例DB块中变量则使用DB快名字在用 ....进行访问,比如第一张图中 “块_2_DB_1″.BtnPress 四、变量类型 大部分变量类型大家基本都认识了,比较搞得是时间类型,简单说下 Time 相当于TimeSpan,表示一段时间 比如

1.6K10

iOS底层原理总结 - 探寻Runtime本质(四)

局部变量存储结构 上面我们知道当person实例对象调用方法时候,会取实例变量前8个字节空间也就是isa来找到类对象地址。那么当访问实例变量时候,就跳过isa8个字节空间往下面去找实例变量。...局部变量内存结构 此时在访问_name成员变量时候,越过cls内存往高地址找就会来到string,此时拿到成员变量就是string了。...局部变量内存结构 当需要访问_name成员变量时候,会在cls后高地址为查找8位字节空间,而我们知道int占4位字节,那么此时8位内存空间同时占据int数据及objc_super结构体内,因此就会造成坏地址访问而...局部变量内存结构 首先通过obj找到cls,cls找到类对象进行方法调用,此时在访问nickName时,obj查找成员变量,首先跳过8个字节cls,之后跳过name所占8个字节空间,最终再取8个字节空间取出其中作为成员变量值...局部变量分配在栈空间,并且从高地址向低地址连续分配。先创建局部变量分配在高地址,后续创建局部变量连续分配在较低地址。 3. 方法调用消息机制,通过isa指针找到类对象进行消息发送。 4.

89840

变量类型、构造器、封装以及 LeetCode 每日一题

成员变量无须显示初始化,系统会自动在准备阶段或创建该类实例进行默认初始化。 与成员变量不同,局部变量除了形参之外,都必须显示初始化。...命名规则: 一个类里不能定义两个同名成员变量,即使一个是类变量,一个是实例变量; 一个方法里不能定义两个同名方法局部变量,方法局部变量与形参也不能同名; 同一个方法中不同代码块代码块局部变量可以同名...(对于实例变量)或类名(对于类变量作为调用者来限定访问成员变量。 1.2成员变量初始化和内存 当系统加载类或创建该类实例时,系统自动为成员变量分配内存空间,并在分配空间后,自动为成员变量赋初值。...虽然我们还是能通过实例访问这个类变量,但是通过任何实例访问变量都是同一个值,因为实际我们还是通过实例所属类去访问,为了避免语义混淆,建议访问变量时候通过类去访问,而不是实例。...良好封装可以实现一下目的: 隐藏类实现细节; 让使用者只能通过事先预定方法来访问数据,从而可以在该方法里加入逻辑控制,限制对成员变量不合理访问; 可进行数据检查,从而有利于保证对象信息完整性;

65520

Java基础(四)Java 对象和类

Java作为一种面向对象语言。支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 对象:对象是类一个实例(对象不是找个女朋友),有状态和行为。...(){} voidsleeping(){} } 一个类可以包含以下类型变量: · 局部变量:在方法、构造方法或者语句块中定义变量被称为局部变量。...成员变量可以被类中方法、构造方法和特定类语句块访问。 · 类变量:类变量也声明在类中,方法体之外,但必须声明为static类型。...: tommy 访问实例变量和方法 通过已创建对象来访问成员变量和成员方法,如下所示: /* 实例化对象*/ ObjectReference = newConstructor(); /* 访问类中变量...*/ ObjectReference.variableName; /* 访问类中方法*/ ObjectReference.MethodName(); 实例 下面的例子展示如何访问实例变量和调用成员方法

47130
领券