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
从类外读取值.
ones
线程安全性?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)
如何增加线程安全?
你可以使用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
它作为实现细节保留 - 它不会被类的公共接口公开.
归档时间: |
|
查看次数: |
5476 次 |
最近记录: |