浅谈 java ++

浅谈Java ++

接触 java 两年了,虽然看过不少书籍,但是关于Java的细节,还是了解的不够好。在面试的时候就发现这个问题,好多这方面的问题都回答不上来。为了提高自己的能力,没事就逛逛论坛,学习大佬的经验。

一次看到一个小学弟关于多线程方面的代码,使用了同步锁,但是线程没有同步执行。分析代码之后发现其同步锁是Integer对象,在运行的时候会执行++操作从而改变了锁对象造成同步失败。

于是就想改写一下代码,首先就是想办法在改变Integer对象值,不改变引用,可惜失败了,因为Integer 是个不可改变对象,学习两年java ,才知道这点,是不是很搞笑。只要接触c或者其他语言,都会知道++ii++ 区别,前者是先计算在赋值,后者时先赋值后计算。但是我在实验中犯了迷糊:

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 就相对好理解,先加在赋值,这个步骤需不需要缓存就不得而知了。在测试是两个时间都很短说明不了问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值