浅谈Java ++
接触 java 两年了,虽然看过不少书籍,但是关于Java的细节,还是了解的不够好。在面试的时候就发现这个问题,好多这方面的问题都回答不上来。为了提高自己的能力,没事就逛逛论坛,学习大佬的经验。
一次看到一个小学弟关于多线程方面的代码,使用了同步锁,但是线程没有同步执行。分析代码之后发现其同步锁是Integer对象,在运行的时候会执行++操作从而改变了锁对象造成同步失败。
于是就想改写一下代码,首先就是想办法在改变Integer对象值,不改变引用,可惜失败了,因为Integer 是个不可改变对象,学习两年java ,才知道这点,是不是很搞笑。只要接触c或者其他语言,都会知道++i
和i++
区别,前者是先计算在赋值,后者时先赋值后计算。但是我在实验中犯了迷糊:
Integer one = new Integer(0);
one = one++;
System.out.println(one);
在我的分析中,首先取one
的值赋给one
,然后在执行++
结果应该是1,但实际的结果是0.然后自己就查了查,发现自己错的十万八千里。首先说一下,赋值语句在一个指令里最后执行,具有最低优先级,也就是说先执行 加操作,在执行赋值,注意这里所说的是赋值,不是取值,这是有区别的。one ++
首先取出one
的值放入缓存里,这个值也就是one ++
表达式的值;其次就是对one
执行加操作变为1,之后在把表达式的值(第一步放入缓存的值)付给one
one又变回了0。真是绕一圈又回来了,其过程相当于下面代码
int one=0;
int two=one;
one=one+1;
onr=two;
可见one=one++
需要一个缓存。one=++one
就相对好理解,先加在赋值,这个步骤需不需要缓存就不得而知了。在测试是两个时间都很短说明不了问题。