◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
主程序中变量值未更新的原因
在多线程场景下,不同线程拥有自己的内存空间,称为线程私有区域。当线程中对变量进行修改时,该修改仅反映在该线程的私有区域中,而不会影响主程序的内存空间。
在给定的示例中,主程序创建了一个名为 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 对象作为参数传递给线程,确保主程序和线程都能访问同一个变量对象,从而实现对变量值的同步更新。
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。