如何在线程之间共享一个变量?

How to share a variable among the threads?

我有两个线程,名为 t1t2。它们只对 total 整数变量进行加法运算。但是变量 total 不在这些线程之间共享。我想在 t1t2 线程中使用相同的 total 变量。我该怎么做?

我的 Adder 可运行 class:

public class Adder implements Runnable{

    int a;
    int total;

    public Adder(int a) {
        this.a=a;
        total = 0;
    }

    public int getTotal() {
        return total;
    }

    @Override
    public void run() {
        total = total+a;

    }

}

我的主class:

public class Main {

    public static void main(String[] args) {

        Adder adder1=new Adder(2);

        Adder adder2= new Adder(7);

        Thread t1= new Thread(adder1);
        Thread t2= new Thread(adder2);

        thread1.start();
        try {
            thread1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        t2.start();
        try {
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        System.out.println(adder1.getTotal());  //prints 7 (But it should print 9)
        System.out.println(adder2.getTotal()); //prints 2  (But it should print 9)


    }

}

两个打印语句都应给出 9 但它们分别给出 7 和 2(因为 total 变量不是 t1t2)。

最简单的方法是制作 total static,以便它在所有 Adder 个实例之间共享。

请注意,对于您在此处共享的 main 方法来说,这种简单的方法就足够了(实际上并没有 运行 任何并行的东西,因为每个线程都是 joined刚开始时)。对于线程安全的解决方案,您需要保护添加,例如,通过使用 AtomicInteger:

public class Adder implements Runnable {

    int a;
    static AtomicInteger total = new AtomicInteger(0);

    public Adder(int a) {
        this.a = a;
    }

    public int getTotal() {
        return total.get();
    }

    @Override
    public void run() {
        // return value is ignored
        total.addAndGet(a);
    }
}