计算多个线程中的单个变量

0 java multithreading thread-safety runnable

我有以下runnable类.

public class OnesRun implements Runnable {

    public int ones = 0;

    private int passendNumber;

    public OnesRun(int passendNumber) {
        this.passendNumber = passendNumber;
    }

    public void run() {
        if (passendNumber == 1)
            ones++;
    }

}
Run Code Online (Sandbox Code Playgroud)

这个类的每个实例都应该增加ones它遇到一个的值.

在执行完所有线程后,我想ones从类外读取值.

  1. 如何增加ones 线程安全性?
  2. 我如何ones从这门课外访问 ?通过静态变量?或者我可以将它放入应用程序上下文中吗?

编辑:

我希望以下伪代码能使我的意图更清晰.

OnesRun.ones = getCurrentValueOnes();

while ( (number = readNumbersFromFile) != null) {
   threadPool.execute(new OnesRun(number));
}

print("Overall values of ones " + OnesRun.ones);
Run Code Online (Sandbox Code Playgroud)

Pét*_*rök 7

如何增加线程安全?

你可以使用AtomicInteger.

如何从本课外访问?通过静态变量?或者我可以将它放入应用程序上下文中吗?

你可以使用一个简单的吸气剂.或者我错过了什么?

更新

根据您的更新,以下是我将如何修改您的代码示例:

public class OnesRun implements Runnable {

    private static final AtomicInteger ones = new AtomicInteger();

    private final int passendNumber;

    public OnesRun(int passendNumber) {
        this.passendNumber = passendNumber;
    }

    public void run() {
        if (passendNumber == 1)
            OnesRun.ones.incrementAndGet();
    }

    public static void setOnes(int newValue) {
        ones.set(newValue);
    }

    public static int getOnes() {
        return ones.get()
    }
}

...

OnesRun.setOnes(getCurrentValueOnes());

while ( (number = readNumbersFromFile) != null) {
   threadPool.execute(new OnesRun(number));
}

print("Overall values of ones " + OnesRun.getOnes());
Run Code Online (Sandbox Code Playgroud)

除了什么已经讨论过了(做ones一个private static AtomicInteger和添加的getter/setter对),我做了两个成员final,这始终是最好如果可能的话,尤其是在并行代码.

另请注意,AtomicInteger它作为实现细节保留 - 它不会被类的公共接口公开.