专栏首页奕仁专栏为什么局部变量是线程安全的?

为什么局部变量是线程安全的?

最近看到一个问题,说是 局部变量是线程安全的?一开始我是拒绝的,因为在我的意识里如果多个线程同时访问一个方法就一定为导致数据竞争,从而导致数据混乱。于是我就开始验证我的结论是对的(在线打脸现场emm…)

为什么局部变量是线程安全的?

demo

public class HasSelfPrivateNum {

    public void addI(String username){
        try{
            int num = 0;
            if(username.equals("a")) {
                num = 100;
                System.out.println("a set over !");
                Thread.sleep(2000);
            }
            else{
                num = 200;
                System.out.println("b set over !");
            }
            System.out.println(username + " num = " + num);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
} 

当多个线程访问add方法的时候 并操作add方法下的变量,永远都不会导致数据竞争,为什么呢? look at the next line↓:

每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。如何理解上面这句话:

结论

局部变量(方法内部的私有变量)是线程安全的,代码中的num这个私有变量是线程安全的,原因是在new HasSelfPrevateNum()这个类的时候它只会为类中的属性成员变量开辟空间,而方法只在方法区开辟一个内存空间并且只存一份是共用的代码段(变量在堆区,引用在栈区),而方法中的私有变量不会先开辟出内存空间,而是等调用时在对应调用线程中为方法中的变量申请空间,所以有几个线程调用则每个线程就会在自己的线程空间的栈为局部变量申请几个引用同时在堆中为变量再申请对应的空间(即方法内的私有变量有几个线程就在栈中申请几个引用,在堆中申请几个空间),所以多线程在调用时只会处理自己线程内的方法的私有变量,因此,方法内的私有变量是线程安全的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 主线程和子线程下的事务不回滚【spring】

    今天写了一个业务,用到了spring的多线程组件ThreadPoolTaskExecutor,大体配置为这样的:

    奕仁
  • tomcat的线程池机制

    首先先在tomcat官网找到对应的tomcat线程池配置,具体定位在:Tomcat线程池

    奕仁
  • java并发编程工具类之CyclicBarrier

    字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们...

    奕仁
  • 第37节:多线程安全问题

    创建线程的方法 继承类Thread并重写run(),run()称为线程体;用这种方法定义的类不能再继承其他类。

    达达前端
  • Netty中的线程处理EventLoop

    运行任务处理的在编程上的构造通常称作事件循环,Netty使用EventLoop来描述。一个EventLoop将由一个永远不会变的Thread驱动,它可以被指派给...

    爬蜥
  • 【Python之旅】第六篇(四)

        我们知道,不同进程之间的内存空间数据是不能够共享的,试想一下,如果可以随意共享,谈何安全?但是一个进程中的多个线程是可以共享这个进程的内存空间中的数据的...

    py3study
  • JMeter(连载3)

    这个组件用于测试流程的参数化,参数化文件采用类似于CSV文件。如图16所示。通过菜单“Add->Config Element->CSVData Set Conf...

    小老鼠
  • 005.多线程-线程的生命周期

    新建状态: 当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。 如:ThreadTest thread2 = new ThreadT...

    qubianzhong
  • Java多线程系列(三)-----线程池

    https://blog.csdn.net/weixin_39800144/article/details/77803751

    IT云清
  • Java多线程与并发笔记

    synchronized主要是用于解决线程安全问题的,而线程安全问题的主要诱因有如下两点:

    端碗吹水

扫码关注云+社区

领取腾讯云代金券