精华内容
下载资源
问答
  • 主要介绍了Java局部变量线程安全原理分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 局部变量存哪里?3. 调用栈与线程4. 线程封闭 局部变量是否存在并发问题? 在CPU层面,是没有方法概念的,只有一条条的指令,编译程序就是把高级语言编译成一条条指令。 1. 方法是如何被执行的 代码 int a = 7; ...


    局部变量是否存在并发问题?
    在CPU层面,是没有方法概念的,只有一条条的指令,编译程序就是把高级语言编译成一条条指令。

    1. 方法是如何被执行的

    代码

    int a = 7int[] b = fibonacci(a);
    int[] c = b;
    

    方法的调用过程:
    在这里插入图片描述
    每个方法在调用栈里都有自己的独立空间,称为栈帧
    在这里插入图片描述

    2. 局部变量存哪里?

    局部变量就是放到了调用栈里。
    在这里插入图片描述

    3. 调用栈与线程

    每个线程都有自己独立的调用栈。
    在这里插入图片描述

    4. 线程封闭

    仅在单线程内访问数据,例如局部变量。

    5. 总结

    多研究原理性的东西。

    6. 课后思考

    常听人说,递归调用太深,可能导致栈溢出。你思考一下原因是什么?有哪些解决方案呢?

    展开全文
  • 在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
  • 多个线程同时访问共享变量时,会导致并发问题。那么,如果将变量放在方法内部,是不是还会存在并发问题呢?如果不存在并发问题,那么为什么不会存在并发问题呢? 需要更多Java知识点和面试题的朋友可以点一点下方...

    前言

    多个线程同时访问共享变量时,会导致并发问题。那么,如果将变量放在方法内部,是不是还会存在并发问题呢?如果不存在并发问题,那么为什么不会存在并发问题呢?

    需要更多Java知识点和面试题的朋友可以点一点下方链接免费领取

    链接:1103806531暗号:CSDN

    在这里插入图片描述

    著名的斐波那契数列

    记得上学的时候,我们都会遇到这样一种题目,打印斐波那契数列。斐波那契数列是这样的一个数列:1、1、2、3、5、8、13、21、34…,也就是说第1项和第2项是1,从第3项开始,每一项都等于前2项之和。我们可以使用下面的代码来生成斐波那契数列。

    //生成斐波那契数列
    public int[] fibonacci(int n){
        //存放结果的数组
        int[] result = new int[n];
        //数组的第1项和第2项为1
        result[0] = result[1] = 1;
        //计算第3项到第n项
        for(int i = 2; i < n; i++){
            result[i] = result[i-2] + result[i-1];
        }
        return result;
    }
    
    

    假设此时有很多个线程同时调用fibonacci()方法来生成斐波那契数列,对于方法中的局部变量result,会不会存在线程安全的问题呢?答案是:不会!!

    接下来,我们就深入分析下为什么局部变量不会存在线程安全的问题!

    方法是如何被执行的?

    我们以下面的三行代码为例。

    int x = 5;
    int[] y = fibonacci(x);
    int[] z = y;
    
    

    当我们调用fibonacci(x)时,CPU要先找到fibonacci()方法的地址,然后跳转到这个地址去执行代码,执行完毕后,需要返回并找到调用方法的下一条语句的地址,也就是int[] z = y的地址,再跳到这个地址去执行。我们可以将这个过程简化成下图所示。

    在这里插入图片描述

    这里需要注意的是:CPU会通过堆栈寄存器找到调用方法的参数和返回地址。

    例如,有三个方法A、B、C,调用关系为A调用B,B调用C。在运行时,会构建出相应的调用栈,我们可以用下图简单的表示这个调用栈。

    在这里插入图片描述
    每个方法在调用栈里都会有自己独立的栈帧,每个栈帧里都有对应方法需要的参数和返回地址。当调用方法时,会创建新的栈帧,并压入调用栈;当方法返回时,对应的栈帧就会被自动弹出。

    我们可以这样说:栈帧是在调用方法时创建,方法返回时“消亡”。

    局部变量存放在哪里?

    局部变量的作用域在方法内部,当方法执行完,局部变量也就没用了。可以这么说,方法返回时,局部变量也就“消亡”了。此时,我们会联想到调用栈的栈帧。没错,局部变量就是存放在调用栈里的。此时,我们可以将方法的调用栈用下图表示。

    在这里插入图片描述

    很多人都知道,局部变量会存放在栈里。如果一个变量需要跨越方法的边界,就必须创建在堆里。

    调用栈与线程

    两个线程就可以同时用不同的参数调用相同的方法。那么问题来了,调用栈和线程之间是什么关系呢?答案是:每个线程都有自己独立的调用栈。我们可以使用下图来简单的表示这种关系。

    在这里插入图片描述
    此时,我们在看下文中开头的问题:Java方法内部的局部变量是否存在并发问题?答案是不存在并发问题!因为每个线程都有自己的调用栈,局部变量保存在线程各自的调用栈里,不会共享,自然也就不存在并发问题。

    线程封闭

    方法里的局部变量,因为不会和其他线程共享,所以不会存在并发问题。这种解决问题的技术也叫做线程封闭。官方的解释为:仅在单线程内访问数据。由于不存在共享,所以即使不设置同步,也不会出现并发问题!

    最后

    我这边也整理了一份 架构师全套视频教程和关于java的系统化资料,包括java核心知识点、面试专题和20年最新的互联网真题、电子书等都有。有需要的朋友可以点一点下方链接免费领取!

    链接:1103806531暗号:CSDN

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 局部变量 线程 安全 测试 源码,用多线程测试局部变量是否线程安全
  • JVM中,进行方法调用和方法执行背后的数据结构的栈帧,它存储了方法的局部变量表、操作数栈、方法返回地址等信息。而线程都有自己的栈帧,属于线程私有。 而局部变量表是一组变量值的存储空间,用于存放方法参数和...

    JVM中,进行方法调用和方法执行背后的数据结构的栈帧,它存储了方法的局部变量表、操作数栈、方法返回地址等信息。而线程都有自己的栈帧,属于线程私有

    局部变量表是一组变量值的存储空间,用于存放方法参数和方法内部定义的局部变量,并以变量槽(Variable Slot)为最小单位。那么,无论读写两个连续的变量槽是否为原子操作,都不会引起数据竞争和线程安全问题。

    展开全文
  • 浅析Java各种变量线程安全问题

    千次阅读 2019-04-30 11:45:47
    局部变量 静态方法(Static Method) 与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭。 非静态方法(Non-Static Method) 又叫实例...

    静态方法
    非静态方法
    静态变量
    实例变量
    局部变量

    静态方法(Static Method)

    与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭。

    非静态方法(Non-Static Method)

    又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。

    静态变量:线程非安全。

    变量即类变量,位于方法区,为所有该类下的对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。

    变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。

    实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。

    局部变量:线程安全。

    每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

    展开全文
  • 为什么局部变量线程安全的?

    千次阅读 2019-09-17 14:51:04
    文章目录 1. 方法是如何被执行的?...线程封闭:方法里的局部变量,由于不会和其他变量共享,所以没有并发问题,叫线程封闭,官方解释为:单线程内访问数据,由于不存在共享,所以即使不同步也不会有并发问题,
  • java线程编程中,存在很多线程安全问题,至于什么是线程安全呢,给出一个通俗易懂的概念还是蛮难的,如同《java并发编程实践》中所说: 写道 给线程安全下定义比较困难。存在很多种定义,如:“一个类在可以被...
  • Java变量线程安全

    千次阅读 2019-07-11 11:49:58
    volatile、ThreadLocal使用场景和原理 一、并发编程的三个概念 原子性 可见性 有序性 二、volatile使用时必须具备的两条件 对变量的写操作不依赖于当前值 ...随后执行i++,不是线程安全的。 该变量没有包含在...
  • 我们一遍一遍重复再重复地讲到,多个线程同时...那 Java 方法里面的局部变量是否存在并发问题呢?下面我们就先结合一个例子剖析下这个问题。 比如,下面代码里的 fibonacci() 这个方法,会根据传入的参数 n ,返回 1...
  • 局部变量线程安全的理解

    千次阅读 2017-10-11 20:24:16
    如何理解局部变量线程安全
  • Q1:下面这个方法中的变量x是否线程安全呢? public static void method() { int x = 0; for(int i = 1;i<=10;i++) { x *= i; } System.out.println(x); } A:答案是安全的,当多个线程同时执行此方法时,...
  • 如果说互斥同步是多线程间的数据共享,那么线程局部变量就是线程间的数据隔离。ThreadLocal把共享数据的可见范围限制在同一个线程之内,这样无须同步也能实现线程之间数据不争用的问题。当使用ThreadLocal维护变量时...
  • 有时候,对于在多线程中使用static变量有没有冲突,是否存在安全问题不能十分的确定。在使用过程中有点含糊,总想找点时间好好追究一下,可总因开发项目时间的紧迫而搁浅。我想,没有做进一步的研究而拿项目繁忙说事...
  • 1. 静态变量线程安全 静态变量位于方法区,为所有对象共享,它们共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程安全。 public class Test1 implements Runnable { private static int ...
  • 参考文章
  • 线程安全问题存在于实例...(2)每个线程执行的时候会把局部变量存放在各自栈帧的工作内存中(栈帧进入虚拟机栈),虚拟机栈线程间不共享,故不存在线程安全问题。 示例 public class Demo1_jubuanquan { pub...
  • Java线程局部变量ThreadLocal

    千次阅读 2018-04-22 16:14:58
    ThreadLocal类可以让每个线程绑定自己的值,它就像一个全局存放数据的盒子,盒子中可以存放每个线程的私有数据。 ThreadLocal类只有一个无参的构造函数,因此实例化ThreadLocal的方法为: new ThreadLocal&lt;T&...
  • 局部变量线程安全问题

    千次阅读 2018-01-10 15:49:22
    局部变量线程安全问题 只看楼主 收藏 回复 mincike 沝 2 求大神给解释下 回复 1楼 2016-02-...
  • java局部变量没有默认值

    万次阅读 2018-01-13 17:31:13
    今天做到一道题,关于java局部变量没有默认值,编译不能通过的这个知识点的考察 public class Test{ String a; public static void(String args[]){ String s; System.out.println(s); } } 此时a是成员变量...
  • 一时疏忽,导致ArrayList出现线程安全问题就算在方法内使用局部变量,但使用异步多线程执行任务,还是会出现线程安全问题以下是错误、正确使用的示例方法import java.time.LocalDateTime; import java.util....
  • 局部变量是保存在每条线程的各自的栈中,互不影响。 单例模式下成员变量会有线程安全问题,因为每条线程都可能会访问到该成员变量;多例模式下则不会有这问题,不会有这问题的原因是 栈中的对象分别指向堆中属于...
  • Java线程操作局部变量与全局变量

    万次阅读 2013-10-18 10:30:04
    在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制... 说到线程同步,大部分情况下, 我们是在针对“单对象多线程”的情况进行讨论,一般会将其分成两部分,一部分是关于“共享
  • Java局部变量final

    千次阅读 2018-10-26 09:25:36
    在一个线程A中开起另一个线程B,如果线程B要使用线程A的局部变量,那么A的局部变量需要定义成final。理由:局部变量线程内部共享的,每一个线程内的不能访问其他线程局部变量,但是上诉的情况却违背了这一原则,...
  • Java线程编程中,存在很多线程安全问题,至于什么是...此处不赘述了,首先给出静态变量、实例变量、局部变量在多线程环境下的线程安全问题结论,然后用示例验证,请大家擦亮眼睛,有错必究,否则误人子弟!静态变量:
  • java线程安全测试

    2012-07-05 10:15:34
    java 线程安全的几个测试小例子,充分的理解JMM中的线程内存模型
  • java线程安全

    千次阅读 2018-12-12 16:03:33
    线程安全产生的主要原因:因为多个线程共享一个内存,所以当多个线程共享一个全局变量的时候,可能会受到其他干扰。 如线程更新会先在本地内存更新,然后再同步到共享内存中,当多个线程同时读写的时候,数据会...
  • 在多线程情况下 局部变量与全局变量 哪个比较安全局部变量是在堆栈中运行。每个运行的线程都有自己的堆栈。 别的线程无法访问得到,因此我们说,局部变量是“安全”的。全局变量在堆中,堆是对所有的线程都可见...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 147,059
精华内容 58,823
关键字:

java局部变量线程安全吗

java 订阅