请问以下程序运行之后a的值是多少?
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Test {
static int a = 0;
static Runnable r1 = new Runnable() {
@Override
public void run() {
a++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
a++;
}
};
public static void main(String[] args) throws InterruptedException {
ExecutorService pools = Executors.newFixedThreadPool(100);
for (int i = 0; i < 100; i++) {
pools.execute(r1);
}
Thread.sleep(5 * 1000);
System.out.println("a = " + a);
pools.shutdown();
}
}
其实,这个程序每次运行的结果都不一定,那如何才能让它打印出200呢?
我们先给a 加个 volatile,继续运行,发现每次结果还是不一样. 原因在于 a++ 不是原子操作,也没有给a加同步 ,最终解决方案为使用支持原子操作的 AtomicInteger。
最终程序为:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
class Test {
static AtomicInteger a = new AtomicInteger(0);
static Runnable r1 = new Runnable() {
@Override
public void run() {
a.incrementAndGet();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
a.incrementAndGet();
}
};
public static void main(String[] args) throws InterruptedException {
ExecutorService pools = Executors.newFixedThreadPool(100);
for (int i = 0; i < 100; i++) {
pools.execute(r1);
}
Thread.sleep(5 * 1000);
System.out.println("a = " + a.get());
pools.shutdown();
}
}
每次都打印出200.