线程 synchronized 问题
package com.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class AutomicityTest implements Runnable {
private int i = 0;
public int getValue() {
return i;
}
public synchronized void evenIncrement() {
i+=2;
/*i++;
i++;*/
}
@Override
public void run() {
while(true) {
evenIncrement();
}
}
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
AutomicityTest automicityTest = new AutomicityTest();
exec.execute(automicityTest);
while (true) {
int value = automicityTest.getValue();
if(value%2 != 0) {
System.out.println(value);
System.exit(0);
}
}
}
}
evenIncrement() 这个方法的 i+=2; 程序不会停, 变成 i++ ;i++;程序就停了
大哥大姐们看一下
回答
首先你要理解红框处代码的意思:
if( value%2 != 0 ) {}
value是奇数才会进入if代码块,而 i 默认值为0,是个偶数,i+=2肯定一直都是偶数,所以就死循环了;i++,++i是加1操作,为奇数,执行 System.exit(0); 退出虚拟机。