代码如下:
package concurrency;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author sh
*
*/
public class AtomicityTest implements Runnable {
private Integer i = 0;
public int getValue() {
synchronized (i) {
return i;
}
}
private void evenIncrement() {
synchronized (i) {
// i=i+2;
i++;
i++;
}
}
@Override
public void run() {
while (true) {
evenIncrement();
}
}
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
AtomicityTest at = new AtomicityTest();
for (int i = 0; i < 10; i++) {
exec.execute(at);
}
while (true) {
int val = at.getValue();
if (val % 2 != 0) {
System.out.println(val);
System.exit(0);
}
}
}
}
我这里对i做同步为何不行?别和我说别的解决办法,告诉我为什么就行,谢谢.分不多了,不好意思啊
------解决思路----------------------
感觉是因为Integer操作完出来都不是原来那个对象
所以10个线程可以同时进行操作,getValue时候那个锁住的不是同一个对象
------解决思路----------------------
Integer是final的,应该和string一样,i的值改变了,那么对象也变了,锁也变了
------解决思路----------------------
i++打个断点,10个线程都能进这个方法....
真锁住的话其他线程在当前线程断点卡在这个方法里面时候是进不去这个方法的