请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

无法输出4.0,如何才能输出

package com.mmall.concurrency.example.atomic;

import com.mmall.concurrency.annoations.ThreadSafe;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.LongAdder;

@Slf4j
@ThreadSafe
public class AtomicExample4 {

    private static AtomicReference<Double> count = new AtomicReference<>(0d);

    public static void main(String[] args) {
        count.compareAndSet(0d, 2d); // 2
        count.compareAndSet(0d, 1d); // no
        count.compareAndSet(1d, 3d); // no
        count.compareAndSet(2d, 4d); // 4
        count.compareAndSet(3d, 5d); // no
        log.info("count:{}", count.get());
    }
}

正在回答 回答被采纳积分+3

2回答

Jimin 2019-02-16 21:28:26

我刚才看错了,我以为你使用的课程里的例子。
你这里是改成了Double,这里是因为:Double a=0d Double b=0d,a==b其实返回的是false(你可以自己本地试一下),因此前两次compareAndSet其实并没有更新,后面几次就更无无法更新了,因此返回的结果是0.0

0 回复 有任何疑惑可以回复我~
  • 提问者 car #1
    AtomicReference<Double>是没办法的吗,两个double用==判断相等是错误的,这个我知道。我的要求是4.0。
    回复 有任何疑惑可以回复我~ 2019-02-16 22:09:54
  • Jimin 回复 提问者 car #2
    恩,AtomicReference本身要解决这个double相等的问题很难,你目前这个换成AtomicDouble就可以了,double本身存储的值是不精准的,AtomicDouble里compareAndSet是做了特殊处理的(本质上是通过 native方法 doubleToRawLongBits 做了一次转换)
    回复 有任何疑惑可以回复我~ 2019-02-16 22:19:17
  • 提问者 car 回复 Jimin #3
    多谢老师了,给我思路开阔了
    回复 有任何疑惑可以回复我~ 2019-02-17 09:34:26
Jimin 2019-02-16 19:37:34
你好,你本地输出的是多少?或者你debug下,看看过程中那几次compareAndSet之后count都是什么值,看看哪次和注释的结果不一样了(注释里no代表的是没更新)
0 回复 有任何疑惑可以回复我~
  • 提问者 car #1
    0.0
    回复 有任何疑惑可以回复我~ 2019-02-16 19:50:18
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号