[英]UnsupportedOperationException When Adding Null to ArrayList
[英]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.