方法中定义的局部变量是否线程安全?

 我来答
世纪网络17
2022-06-09 · TA获得超过5910个赞
知道小有建树答主
回答量:2426
采纳率:100%
帮助的人:138万
展开全部

了解过JVM的都知道,堆和方法区(JDK1.8后叫元空间)是线程共享的

虚拟机栈、程序计数器(PC寄存器)和本地方法栈是线程私有的

虚拟机栈里面存的是一个一个的栈帧,这里的栈帧你也可以理解为此时正在运行的方法,如果此方法调用其他方法的话,在虚拟机栈中就形成了一个个栈帧堆叠的形态,相信读到这里你已经对虚拟机栈的样子有了感觉

接着,我们讨论栈帧(方法

栈帧有五个部分组成

在这里讲栈帧的组成只是为了给不熟悉的同学涨涨知识或者给大家复习一波。

接着,我们回到题目

你会发现方法区中定义的局部变量不就是存在于局部变量表中嘛,而局部变量表有存在于栈帧,栈帧存在于虚拟机栈,那它不就是线程私有的,也就是安全的嘛!

其实,这里面有些坑,看完下面这四个例子我相信你会恍然大悟!

2和3发生了逃逸,作用域不止在方法内部了

1和4未发生逃逸,是安全的

我们要明确一个概念: 创建对象不一定在堆空间上创建,还可以在栈上创建

总结:method1和4是安全的,2和3是不安全,所以这道题方法中定义的局部变量不一定线程安全,要看具体使用。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式