迷茫2017-04-18 10:39:15
Reference StackOverflow question:
http://stackoverflow.com/ques...
However, I still have more to say, so please give me your advice and discussion!
Run the following test program, the final result is not 20000, the results are overwritten many times in the middle.
public class Test {
private static int staticVariableOne = 0;
public Test() {
super();
}
public static int getStaticVariableOne() {
return staticVariableOne;
}
public static void setStaticVariableOne(int staticVariableOne) {
Test.staticVariableOne = staticVariableOne;
}
private static void increaseStaticVariableOne() {
staticVariableOne++;
}
public synchronized void add() {
System.out.println("执行 add() 开始...");
try {
for (int i = 0; i < 10000; i++) {
increaseStaticVariableOne();
Thread.sleep(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行 add() 完毕...");
}
public synchronized static void addStatic() {
System.out.println("执行 addStatic() 开始...");
try {
for (int i = 0; i < 10000; i++) {
increaseStaticVariableOne();
Thread.sleep(2);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行 addStatic() 完毕...");
}
}
public class StudyMain {
public static void main( String[] args ) {
final Test insertData = new Test();
Thread threadOne = new Thread() {
@Override
public void run() {
insertData.add();
}
};
Thread threadTwo = new Thread() {
@Override
public void run() {
Test.addStatic();
}
};
threadOne.start();
threadTwo.start();
try {
threadOne.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
threadTwo.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("After 20000 times increasements, final staticVariableOne is "
+ Test.getStaticVariableOne());
}
}