11Java线程(下)为什么局部变量是线程安全的?
当多个线程访问共享变量时,导致并发问题,Java里面是不是所有的变量都是共享变量呢?不少同学给所有的局部变量设置同步,显然没有把共享变量说清楚,那么Java局部变量是否存在并发问题呢?
很多人知道,局部变量是不存在竞争的,至于原因吗?说不清楚。
你需要稍微知道点编译原理的东西,CPU层面是没有方法的概念的,只有一条条的指令,编译程序就是把高级语言里的方法转换成一条条的指令,你可以站在编译器实现的角度,思考怎么完成方法到指令的转换呢? 方法是如何被执行的
高级语言的普通语句里,翻译成 CPU 的指令相对简单,可方法的调用就比较复杂了。例如下面这三行代码:第 1 行,声明一个 int 变量 a;第 2 行,调用方法 fibonacci(a);第 3 行,将 b 赋值给 c。 int a = 7; int[] b = fibonacci(a); int[] c = b;
当你调用 fibonacci(a) 的时候,CPU 要先找到方法 fibonacci() 的地址, 然后跳转到这个地址去执行代码,最后 CPU 执行完方法 fibonacci() 之后,要能够返回。 首先找到调用方法的下一条语句地址,:也就是int[] c=b;的地址,再跳转到这个地址去执行。 你可以参考下面这个图再加深一下理解。
到这里,方法调用的过程你就清楚了,但还有一个问题,CPU去哪里找到方法调用的参数和返回地址呢?如果你熟悉,就会立刻想到,CPU的堆栈寄存器。CPU支持一种栈结构,先入后出。因为 这个是跟方法调用相关的,所以叫做调用栈。
例如,有三个方法 A、B、C,他们的调用关系是 A->B->C(A 调用 B,B 调用 C),在运行时,会构建出下面这样的调用栈。每个方法在调用栈里都有自己的独立空间,称为栈帧,每个栈帧里都有对应方法需要的参数和返回地址。当调用方法时,会创建新的栈帧,并压入调用栈;当方法返回时,对应的栈帧就会被自动弹出。也就是说,栈帧和方法是同生共死的。
利用栈结构来支持方法调用这个方案非常普遍,以至于 CPU 里内置了栈寄存器。虽然各家编程语言定义的方法千奇百怪,但是方法的内部执行原理却是出奇的一致:都是靠栈结构解决的。Java 语言虽然是靠虚拟机解释执行的,但是方法的调用也是利用栈结构解决的。 局部变量存哪里?
我们已经知道方法的调用在CPU眼里怎么执行的,但还有一个关键问题,方法内的局部变量存在哪里?
局部变量的作用域是方法内部,也就是说当方法执行完,局部变量就没用了,局部变量应该跟方法共生死,所以局部变量放到调用栈那边是相当合理,事实上,的确这样,局部变量就是放到了调用栈里,于是调用栈结构就变成了如下:
基本都会知道,所有的教材都会告诉你,new出来的对象存在堆里,只不过很多人不清楚 堆跟栈的区别,以及为什么要区分 堆跟栈,现在清楚了局部变量是跟方法同生死的,一个变量想跨越方法的边界,就必须在堆里。 调用栈与线程
两个线程可以同时用不同的参数调用相同的方法。那调用栈跟线程是一种什么关系呢?答案: 每个线程都有自己独立的调用栈 。如果不是这样,那么线程就相互干扰了,如下图所示:
现在再来 让我们看下开头的问题,Java方法里面的局部变量是否存在并发的问题呢?现在你应该很清楚了,一点问题也没有,因为每个线程都有自己的独立调用栈,局部变量存在各自调用的线程栈中,不会共享,自然不会有共享问题,再次重申一遍:没有共享 就么伤害!! 线程封闭
方法里的局部变量,因为不会和其他线程共享,所以没有并发问题,这个思路很好,已经成为解决问题的一种思路方法,这里有个响亮的名字叫做:线程封闭。
即 仅在单线程内访问数据。由于不存在共享,所以即便不同步也不会出现并发问题。
采用线程封闭的案例很多,数据库连接池获取的 connection,jdbc规范并没有要求这个connection必须是线程安全的。数据库连接池通过线程封闭技术,获取到的connection在释放之前不会再分配给其他请求。从而保证不会有并发问题。
快运疯狂敛财,资本理性断供无论是今年的河南洪水还是突如其来的零星疫情,每次灾难面前都很难见到平日里一直都热爱品牌宣传的诸多快运品牌,反而更多的是平日里备受欺压加盟商网点更有爱心,承担起社会责任。更有甚者,反
十月份即将发布的手机有没有你期待的?第一部黑鲨4sPro游戏手机搭载骁龙888plus处理器同时配备台式机的SSD磁盘阵列安卓性能巅峰144hz高刷的三星屏120W快充4500毫安的电池充满电用时不到
小米真的消灭了山寨机吗?山寨机的泛滥是从2G时代开始发展的因为联发科提供了一站式的解决方案芯片和系统打包销售你想制作手机只需要把屏幕和按键等部件做出来就可以了制作手机的门槛几乎为零山寨机时代的没落除了小米
高刷究竟有多费电?你的手机是120hz刷新的屏幕吗?是的扣1不是的扣2你们知道120hz的屏幕究竟有多费电吗?看到结尾有惊喜用两台三星s20ultra其他设置都完全相同左边那个是60hz右边那个是1
红米Note11Pro也配叫旗舰机?红米Note11Pro叫体验小旗舰为了天玑920能得到大家的理解一般大家都认为只有各厂配置最好的手机才能称之为旗舰但是旗舰这个词最近被玩坏了Civi叫颜值手感旗舰11ultra叫拍
10月下旬将发布的两款手机,有没有你喜欢的?第一款ramlmeq3s搭载骁龙778G处理器6。59英寸LCD屏支持120hz高刷后置三摄采用圆形相机模组5000毫安的大电池30W快充预计价格会在1200到1300之间顶替目前
大地震SupernovaLuminous超低音上市开箱美国超低音的标志,大地震品牌隆重发布全新超低音SupernovaLuminous系列!目前有双15寸及双12寸两个版本。视频加载中大地震旗舰系列超低音Supernova超级强悍的效
不计成本的杰作Cambridge剑桥EdgeNQEdge系列是CambridgeAudio成立50周年所推出的纪念产品,由于是周年纪念产品,所以CambridgeAudio是以最高规格来设计制作。EdgeNQ是这个系列的数字串流
音乐之都,音乐之魂Vienna维也纳之声古典贝多芬维也纳是独特的城市,作为神圣罗马帝国与奥兄弟国首都,哈布斯堡家族经营下的美丽城市,总是有一种强烈的高贵与华丽。各种因缘之下,维也纳没有受到太多战火摧残,故此市容不但典雅,亦非常美丽
音为有万家HiFi响见圣诞圣诞节就要到了乏味许久的街又穿上久违的圣诞装Jinglebells的旋律在耳边跳起了舞仿佛繁复忙碌的日子伴随梦幻般的铃铛声消散不见那些解不开的烦恼结都变成了快乐的圣诞结圣诞节快乐每
超乎想象的精彩FocalChora816落地喇叭当伦敦交响乐团在普列文指挥下发出强悍又急促的齐奏,钢琴家鲁普富有节奏地弹出下行音型,双簧管悠扬地吹出第一主题,同时可听见其他木管的对位,钢琴继之以复述,然后导出乐团的合奏,第二主题