线程 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); 退出虚拟机。

以上是线程 synchronized 问题的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>