![](/img/trans.png)
[英]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.