java多线程,锁的问题

下面这段代码中,为什么会打印出奇数值并且退出,但是将注释去掉,程序就不会退出呢?求大神解答啊

package com.zy.test.lock;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class AtomicityTest implements Runnable
{
private int i = 0;
public synchronized int getValue()
{
return i;
}

public synchronized void evenIncrement()
{
    i++;

// i++;
}

public void run()
{
    while (true)
    {
        evenIncrement();
    }
}

public static void main(String[] args)
{
    ExecutorService service = Executors.newCachedThreadPool();
    AtomicityTest test = new AtomicityTest();
    service.execute(test);
    while (true)
    {
        int val = test.getValue();
        if (val % 2 != 0)
        {
            System.out.println(val);
            System.exit(0);
        }
    }
}

}

4个回答

jackloss
jackloss 答非所问啊
3 年多之前 回复
 if (val % 2 != 0)

这逻辑不是打印奇数、退出程序?这有啥疑问。

如果有注释:

evenIncrement方法中的i会加1,会从沿着1、2、3、4、5、6一直到int的最大值溢出,然后从头开始。if (val % 2 != 0)是获取判断值是不是奇数,
如果是奇数,就会走if的方法,System.out.println打印该值,System.exit(0);正常退出当前程序。

如果没有注释:
evenIncrement方法中的i会加2,会变成2、4、6、8、10、一直到int最大然后溢出,所有的值都是偶数,就不会走if里面的打印和退出方法。

jackloss
jackloss 多謝,多謝,哎,一直在考慮鎖的問題,忽略了兩個I++是偶數了
3 年多之前 回复

楼上说的对,这程序本来的意思就是打印奇数、退出程序,没有问题呀

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问