假设我拥有2核的CPU。如果我将使用Executors.newFixedThreadPool(4)线程运行后台处理服务我是否正确:
实施例
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class Launcher {
public static void main(String[] args) throws Exception {
final Stats stats = new Stats();
final Random key = new Random();
ExecutorService service = Executors.newFixedThreadPool(2);
service.submit(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
String keyValue = String.valueOf(key.nextInt(10));
int value = stats.inc(keyValue);
System.out.println("[A] Key " + keyValue + " was incremented to " + value);
try {
TimeUnit.MILLISECONDS.sleep(1500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
});
service.submit(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
int[] values = new int[10];
for (int i = 0; i< 10; i++) {
values[i] = stats.get(String.valueOf(i));
}
System.out.println("[B] " + Arrays.toString(values));
try {
TimeUnit.MILLISECONDS.sleep(1500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
});
}
static class Stats {
private final Map<String, Number> statistics = new HashMap<String, Number>();
public int inc(String key) {
if (!statistics.containsKey(key)) {
synchronized (statistics) {
statistics.put(key, new AtomicInteger(0));
}
}
return ((AtomicInteger) statistics.get(key)).getAndIncrement();
}
public int get(String key) {
if (!statistics.containsKey(key)) {
return 0;
}
return statistics.get(key).intValue();
}
}
}
您能否指出一些有关Java中多线程代码低级管理的宝贵文档?
伙计们,我真的明白我们不应该依赖于特定的架构/ CPU /等等。我只是好奇所描述的点的概率大于0:)
提前谢谢
答案 0 :(得分:4)
除非您对访问进行同步或使变量易变,否则不应对线程看到由其他线程修改的值做出任何假设。
任何其他行为都不可靠,可能会发生变化。
请记住,Java在JVM上运行,而不是直接在您的处理器上运行,并且有许可对您运行的代码进行大量优化。因此,虽然很多行为都会延续,但你不能依赖它。特别是因为只要您在不同的架构上运行或在不同的条件下运行,完全相同的字节码可能会有不同的优化。