繁体   English   中英

当新的ArrayList时为null

[英]Is null when new ArrayList

观看在线产品时出现错误,代码是这样的,但是NullPointedException困扰了我,此错误仅出现一次,并且我无法再次出现。 我不明白为什么ArrayList[null, 1]

public void test4() {
    class PlayerTask {
        List<Integer> targetValueList;

        List<Integer> getTargetValueList() {
            if (null == targetValueList) {
                init();
            }
            return targetValueList;
        }

        private void init() {
            targetValueList = new ArrayList<>();
            targetValueList.add(Integer.parseInt("1"));
        }
    }
    PlayerTask task = new PlayerTask();

    //some code1
    new Thread(() -> {
        task.getTargetValueList().get(0); // NullPointException ,real array is [null, 1]
    }).start();

    //some code2
    new Thread(() -> {
        task.getTargetValueList().size();
    }).start();

    // some code ...
    new Thread(() -> {
        task.getTargetValueList().get(0);
    }).start();

    // ....
    ///task.getTargetValueList().get(..)...
}

您的代码是多线程的,但是在创建和访问new ArrayList<>()时,您无法避免可能出现的争用情况 解决此问题的最快方法是synchronize getTargetValueList()方法:

synchronized List<Integer> getTargetValueList() {
    if (null == targetValueList) {
        init();
    }
    return targetValueList;
}

花一点时间阅读Java中的安全发布和安全初始化 它为如何改进此方法提供了深刻的见解,以及为什么某些模式(如双重检查锁定)不是一个好主意。

如果您想了解有关并发的更多信息,那么《 Java并发实践》是一个很好的起点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM