- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近遇到了一个意外错误(代码不是我的),导致 ArrayIndexOutOfBoundsException
上ArrayList#contains
。相关代码如下。
private static final List<String> list = new ArrayList<>();
static void register() {
update();
new Timer().schedule(new TimerTask() {
@Override
public void run() {
update();
}
}, 0, 21600000);
}
private static void update() {
list.clear();
new Thread(() -> {
List<String> other; //should always be the same length.
list.addAll(other);
}).start();
}
public static boolean contains(String string) { //called long after register
return list.contains(string); //throws ArrayIndexOutOfBounds
}
我很清楚ArrayList
不是线程安全的,可以用 Collections#synchronizedList
之类的东西来修复它。我的问题是了解这个特定的代码如何抛出 ArrayIndexOutOfBoundsException
.
异常的堆栈跟踪在 ArrayList#indexOf
中标识了以下代码.
for (int i = 0; i < size; i++)
if (o.equals(elementData[i])) //here
return i;
在我看来,这只有在 size
时才会发生。大于elementData.length
。据我了解,ArrayList#clear
实际上并没有减少支持数组的长度。调用addAll
应该只是增加其容量,并且 size
总是在数组扩展后更新。我不明白这怎么可能处于 size
的状态大于数组的容量。
我注意到的一个特别细节是 Timer
上的延迟为0,表示update()
快速连续调用两次。我最好的猜测是addAll
调用在某种程度上重叠,离开列表是某种类型的混合无效状态。
如果有人能解释这里发生的事情那就太好了!
最佳答案
如果没有正确的同步,就无法保证一个线程的哪些更改在另一个线程中可见。
无保证意味着如果线程 A 更改 elementData
和 size
,线程 B 会看到:
大小
,但旧的elementData
elementData
,但旧的 size
elementData
的内容没有更新至于为什么会发生这种情况(请参阅 Wikipedia:Java Memory Model 进行简短介绍):
在现代计算机中,主内存相对较慢,因此主内存和执行当前线程的CPU核心之间存在多级缓存。
线程 A 可能会在 CPU 寄存器或多个缓存之一中保留对 size
和 elementData
的更新,并在稍后的某个时间更新主内存(甚至在不同的时间) fields) - 只要线程 A 所做的事情的正确性不受影响。由于没有发生同步,因此无需担心多线程正确性 - 线程 A 的工作方式就好像它是访问这些字段的唯一线程一样。
类似地,线程 B 可以将 size
和 elementData
保存在 CPU 寄存器或缓存中,或者它可以根据需要从主内存更新其中之一或两者(可能是缓存)保存 size
的行已被刷新,需要从主内存重新加载 size
)。由于没有发生同步,线程 B 假设没有其他线程更改这些字段,因此缓存的值始终与主内存中的值相同。
关于java - ArrayList#contains 上的 ArrayIndexOutOfBounds(多线程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51054488/
实体类是: DeviceWithReading.java package com.fde.entity; import java.util.Set; import javax.persistence.
这个问题在这里已经有了答案: What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? (26 个
我有一个小问题,当我尝试从文件读取时,我会遇到 arrayindexoutofboundsException 。我不知道有更好或更详细的解释方法,所以我将粘贴下面的代码和错误。这一切都在我的程序的 m
我写了这个方法: public static Bitmap matrixToBitmap(int[][] slika) { int w = slika[0].length;
我的代码需要一些帮助,当我尝试运行它时,它给了我 arrayindexoutofbounds 0 异常,它指向“results[counter]=random;”行,以及我在它之前写的 system.
我需要以蛇的形式打印矩阵。因此对于这个矩阵,输出应该是: 我的问题是这段代码抛出 ArrayIndexOutofBounds。我该如何处理才能避免这种情况? int[][] mat= {{1,2,3}
我正在制作阿拉伯数字转换器并收到错误: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at ar
我不明白为什么会发生这种情况。如果没有 print 语句,代码可以正常工作,但是当我尝试打印元素时,我得到 ArrayIndexoutOfBounds。例如,如果我尝试提供 3 个元素,则会抛出异常。
我正在尝试将 Google 任务与我的应用程序同步。为此,我创建了一个类,在其中创建了需要获取任务列表和创建列表等的所有方法。 现在我想测试一下这些方法是否有效。为此,我创建了一个扩展 AsyncTa
这个问题已经有答案了: What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? (25 个回答)
所以我目前正在研究多维数组(2D),并且尝试反转二维数组中每个数组的顺序。 所以我有一个二维数组设置为:int firstArray[][] = {{5,6,7,8,9,10}, {11,12,13,
问题出在int [][]tam = new int [a][b]处。就只有那一条线。我是 Java 新手,有 C++ 背景。 //"Exercitiul" 3 Scanner input = new
这是我遇到索引越界异常的代码,我不明白为什么, int index = array.length - 1; E item = array[index]; while (item == null
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
public class Environment { //variables RoundingStage[][] land; int horizontalStreets;
我正在尝试创建一种使用动态编程计算(N 选择 R)的方法,但出现数组越界异常: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsEx
public Pasient[] finnPasient(String dato) { int j = 0; Pasient[] p = new Pasient[j]; for
所以我有一个数组 Canvas[256][256],它的随机索引 Canvas[r][r] (r 是随机的)设置为 1。然后我想循环遍历该数组以准确查看哪个索引是不是 0,然后随机选择一个点(上、下、
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我写了一个 TokenizableString 类,它对用户输入的字符串进行标记化。这是它应该如何进行的示例 我输入 "My name is methos" 我应该在控制台中看到以下内容 'My' '
我是一名优秀的程序员,十分优秀!