首页 > 解决方案 > Java:线程不会增加我传递的类实例的实例变量的值

问题描述

我期待 main 方法中的 println 返回值 45,但它返回 0。

Main class:

public class Main {

public static void main(String[] args) {
    MyCounter counter = new MyCounter();
    Thread thread1 = new Thread(new MyThread(counter));
    thread1.start();
    System.out.println(counter.getCount()); //Prints 0 :(
     }
}

MyThread class:

class MyThread implements Runnable{

    MyCounter counter;

    public MyThread(MyCounter counter){
        this.counter = counter;
    }

    @Override
    public void run() {

        for (int i = 0; i<10; i++){
            counter.inc(i);
        }
    }
}

MyCounter:

class MyCounter {

    private int count = 0;

    public void inc(int i){
        count += i;
    }

    public void dec(){
        count--;
    }

    public int getCount(){
        return count;
    }
}

标签: javamultithreading

解决方案


可能有两种可能的情况。

  1. 当你System.out.println在主线程中调用时,thread1计数器并没有增加。

  2. thread1已经增加了计数器,但是由于内存屏障,主线程没有注意到它。

您可以thread1.join()在调用之前添加System.out.println

当一个线程终止并导致另一个线程中的 Thread.join 返回时,终止的线程执行的所有语句与成功连接之后的所有语句都具有发生前的关系。线程中代码的效果现在对执行连接的线程可见。

这可以确保:

  1. System.out.println将在计数器递增后执行。

  2. 主线程可以获得更新后的计数器。


推荐阅读