登录
首页 >  文章 >  java教程

多线程场景下,为什么主程序中的变量值没有更新?

时间:2024-12-02 12:28:02 453浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《多线程场景下,为什么主程序中的变量值没有更新?》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

多线程场景下,为什么主程序中的变量值没有更新?

主程序中变量值未更新的原因

在多线程场景下,不同线程拥有自己的内存空间,称为线程私有区域。当线程中对变量进行修改时,该修改仅反映在该线程的私有区域中,而不会影响主程序的内存空间。

在给定的示例中,主程序创建了一个名为 va 的值对象,并将其 a 属性设置为 2。然后,它启动了一个线程 td。在 td 线程中,创建一个新的 va 对象并将其 a 属性设置为 10。

由于 td 线程中的 va 对象与主程序中的 va 对象是不同的对象,因此在 td 线程中对 va 的修改不会影响主程序的 va 对象。因此,当主程序在退出 td 线程后访问 va 对象时,它仍然包含最初设置的值 2。

解决方法

为了在主程序中反映线程中对变量所做的修改,需要确保主程序和线程访问同一个变量对象。一种方法是将变量对象作为线程的构造函数参数传递。

修改后的代码如下:

package threadTest;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        System.out.println("=======1========");
        Values va = new Values();
        va.setA(2);
        System.out.println("mainThread1: " + va.getA());

        System.out.println("=======2========");
        ThreadDemo td = new ThreadDemo(va);
        td.start();
        td.join();
        
        System.out.println("=======3=========");
        System.out.println("mainThread2: " + va.getA());
    }

}

class ThreadDemo extends Thread {

    private Values va; // 接收主程序的va对象

    public ThreadDemo(Values va) {
        this.va = va;
    }

    @Override
    public void run() {
        va.setA(10); // 修改传入的va对象
    }

}

class Values {

    private int a;

    public void setA(int a) {
        this.a = a;
    }

    public int getA() {
        return a;
    }

}

通过将 va 对象作为参数传递给线程,确保主程序和线程都能访问同一个变量对象,从而实现对变量值的同步更新。

本篇关于《多线程场景下,为什么主程序中的变量值没有更新?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>