首页 新闻 会员 周边

在线程中改变量值,但主程序中访问却还是原来的?

0
[已解决问题] 解决于 2020-07-12 21:00

第一个 main.java

package threadTest;

public class main {

    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        System.out.println("=======1========");
        values va = new values();
        va.setA(2);
        System.out.println("main:" + va.getA());
        
        System.out.println("=======2========");
        threademo td = new threademo();
        td.start();
        td.join();
        
        System.out.println("=======3=========");
        System.out.println("mainThread:" + va.getA());
    }

}

第二个 threademo.java

package threadTest;

public class threademo extends Thread{
    values vv = new values();
    public void run() {
        vv.setA(10);
        System.out.println("thread:" + vv.getA());
    }
}

第三个 values.java

package threadTest;

public class values {
    private volatile int a;
//    private int a;
    public synchronized void setA(int a) {
        this.a = a;
        System.out.println("seta:" + this.a);
    }
    
    public synchronized int getA() {
        return this.a;
    }
}

运行的结果是:

=======1========
seta:2
main:2
=======2========
seta:10
thread:10
=======3=========
mainThread:2

第1部分结果,就是实例化values 用set方法赋值,在用get方法返回值 打印出来。
第2部分结果,是用td线程 实例化values 然后用set重新赋值,在用get返回打印出来。
第3部分结果,是main里在次用get返回值。但它还是2,为什么不是调用线程后的10呢??

我想让第3处 返回的是10 该怎么做呢???

还没有的主页 还没有 | 小虾三级 | 园豆:531
提问于:2020-07-04 15:54
< >
分享
最佳答案
0

你这个第三部分的va就是第一部分的va啊 跟第二部分的va没有任何关系,,第二部分是你自己new出来的set 10进去,第3的还是跟第一的一样是你set 2的,。。我觉得你是需要将第一部分里面的va传入到第2部分里面的线程 去跑,而不是在第二部分的线程里面又new了个va 。。

奖励园豆:5
biubiubiuovo | 菜鸟二级 |园豆:211 | 2020-07-10 00:50
其他回答(1)
0

你的values每次都是new出来的,不同对象的数据,当然是不同的啊

顾晓北 | 园豆:10844 (专家六级) | 2020-07-05 13:57

怎么办呢?

支持(0) 反对(0) 还没有 | 园豆:531 (小虾三级) | 2020-07-05 21:08

@还没有: 如果你想所有东西访问的都是同一个,那么就静态呗。搜下单例的概念。。。

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 2020-07-06 09:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册