簡體   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