直接上代码:
一个静态变量B,一个静态方法addB,调用线程池循环增加B,如果不加synchronized关键字给addB方法,则会出现不等于1000的问题:
即使此时为B添加volatile,还是不等于正确答案1000.
添加synchronized后,才是正确答案1000;
package org.braven.servlet;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class App {
static int B = 0;
//static volatile int B = 0;
static synchronized void addB() {
try {
Thread.sleep(1);
} catch (Exception e) {
// TODO: handle exception
}
B++;
}
public static void main(String[] args) throws InterruptedException {
/*for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
public void run() {
addB();
}
}).start();
}*/
ExecutorService pool = Executors.newFixedThreadPool(20);
for (int i = 0; i < 1000; i++) {
pool.submit(new Runnable() {
public void run() {
addB();
}
});
}
Thread.sleep(2000);
System.out.println("B最终等于:" + B);
App app1 = new App();
App app2 = new App();
System.out.println(app1.B);
System.out.println(app2.B);
App.addB();
System.out.println(app1.B);
System.out.println(app2.B);
}
}