问题标签 [copyonwritearraylist]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
669 浏览

java - 暴露内部集合项时应该使用 Iterator 还是 Iterable ?

我有一个带有私有可变数据列表的类。

我需要在以下条件下公开列表项:

  • 列表不应在外部修改;
  • 使用 getter 函数的开发人员应该清楚,他们得到的列表是不能修改的。

应将哪个 getter 函数标记为推荐方法?或者您能提供更好的解决方案吗?

UPD:这个问题来自关于 list getter implementation 最佳实践的真实代码审查讨论

0 投票
2 回答
1123 浏览

java - 从 ActiveMQ DestinationSource.getQueues 响应中正确迭代队列

出于某种原因,在以下代码中,destinationSource.getQueues()返回的是 aCopyOnWriteArraySet而不是简单的Set. 这是一个问题,因为 for 循环在满之前开始处理,Set并且由于它的性质,CopyOnWriteArraySet它只会处理Setbefore 循环中的项目。我知道我可以Thread.sleep()在那里扔一个,但这并不能解决根本问题。是否有任何理由将其作为 aCopyOnWriteArraySet而不是 a返回Set?还有什么方法可以迭代 aCopyOnWriteArraySet以确保覆盖所有项目,即使是在迭代期间添加的项目?

编辑:这是我提出的解决方案,虽然它并不完美,但它确保您将获得所有队列,直到添加队列之间的时间超过 1 秒。

0 投票
1 回答
112 浏览

java - CopyOnWriteArrayList - 如何更新堆栈?

在 的情况下CopyOnWriteArrayList,只要将元素添加到集合中,就会创建一个新对象。

考虑下面的例子:

每次添加元素时,都会创建一个新对象,并且playersUsing2堆栈上的引用将更新为指向该内存位置。可以理解。

现在,我传递playersUsing2给另一个方法,因此将创建一个新的堆栈帧,并且playersUsingNew还将指向相同的内存位置。并且当添加新元素时,将创建一个新对象并将playersUsingNew指向新的内存位置。

但是如何playersUsing2更新第一个堆栈帧以指向最新的内存位置?

我看到了java.util.concurrent.CopyOnWriteArrayList.add(E)实现,但无法理解。是不是通过一些本机代码和JVM来处理,它是怎么发生的?

输出:

0 投票
1 回答
1322 浏览

java - CopyOnWriteArrayList 太慢了

我有以下情况,

输出

与大约花费的时间相比,它添加元素非常缓慢。我在文档中知道了原因,ArrayList0.004690843

一种线程安全的变体,ArrayList其中所有可变操作(添加、设置等)都是通过制作底层数组的新副本来实现的。

所以,我的理解是,每当我在这个列表中添加新元素时,它都会创建新的新数组并在这个数组的最后一个索引处添加元素。我找到了一个锁定add方法,除此之外,该方法实际上每次都创建新数组。

当我增加到MAX_NUMBER10_00_000的程序继续运行并且永远不会结束时(它会但我不能等待这么久)。

Collections.synchronizedList当您希望线程安全且速度快时,我认为这是更好的选择。我用了它,它花了大约0.007673728.

我的问题:

  1. 为什么它在内部创建新数组,线程安全与此有关吗?
  2. 为什么要花这么多时间以防万一MAX_NUMBER = 10_00_000?(因为它花了大约 6 秒MAX_NUMBER = 10_00_00)发生这种情况是因为变异操作每次都会创建新数组吗?
  3. CopyOnWriteArrayList当您拥有大量元素并且更好地选择其他东西(即)时,这是否意味着性能下降Collections.synchronizedList
  4. 这就是我们通常CopyOnWriteArrayList在公共 API 中看不到的原因吗?除了这个还有什么缺点吗?
0 投票
2 回答
1052 浏览

java - 具有原子替换的线程安全可序列化集合

当多个线程通过 RMI 访问同一服务器时,我的程序遇到问题。服务器包含一个列表作为缓存并执行一些昂贵的计算,有时会更改该列表。计算完成后,列表将被序列化并发送给客户端。

第一个问题:如果列表在被序列化(例如,由不同的客户端请求某些数据)时发生更改ConcurrentModificationException(可能)抛出一个,导致EOFExceptionRMI 调用/客户端的反序列化。

因此,我需要某种列表结构,它对于序列化是“稳定的”,同时可能被不同的线程更改。

我们尝试过的解决方案

  • 常规 ArrayList / Set - 由于并发而无法正常工作
  • 在每次序列化之前深度复制整个结构 - faaar 太昂贵了
  • CopyOnWriteArrayList- 也很昂贵,因为它复制了列表

揭示第二个问题:我们需要能够以原子方式替换列表中当前不是线程安全的任何元素(首先删除,然后添加(这甚至更昂贵)),或者只能通过锁定列表来实现,因此只做不同的线程按顺序排列。

因此我的问题是:

您是否知道Collection允许我们对serializeCollection 线程安全的实现,而其他线程对其进行修改,and其中包含某种方式的atomically replacing元素?

如果列表not需要copied在序列化之前出现,那将是一个奖励!为每个序列化创建一个快照是可以的,但仍然是 meh :/

问题说明(C=compute,A=add to list,R=remove from list,S=serialize)

0 投票
2 回答
305 浏览

java - 如何在不覆盖 Java 中的当前内容的情况下写入外部文本文件

我正在尝试将错过的响应写入外部文本文件。以下方法将无法识别的响应存储到外部文本文件中,但会覆盖以前的内容。如何阻止它被覆盖?

//写一个列表方法

//我在这个方法中调用它

0 投票
3 回答
141 浏览

c# - 从 bytearray 中删除特定的索引范围,然后重新组合 c#

我有一个要求,我在 bytearray 中有大量数据。我想选择 39998 数据并跳过 39999,40000.40001,40002 索引,然后在此 39998 数据之后再次选择并跳过 39999,40000.40001,40002。

所以我的要求是我需要大小为 39998*12=479976 的总字节数组

我已经尝试过这个解决方案

但它改变了名单。

我需要从 1 到 39998 选择数据跳过 4 个字节,然后选择 39998 并跳过 4 个字节,依此类推,最多 12 次。然后重新组合字节数组。实际上,如果我们使用列表,它会在第二次移动索引它会出现问题(删除另一个索引)。所以如果你有其他建议,请告诉我

0 投票
1 回答
60 浏览

java - 购物车未从第二次尝试更新数量

我正在尝试使用两个 java 类来实现购物车流程。一个是CartItem,另一个是ShoppingCart包含购物车的所有过程。

这是我的CartItem

我的ShoppingCart班级:

这是我添加产品和输出的方式:

输出:

但预期:

提前致谢。

0 投票
2 回答
1580 浏览

java - 将 CopyOnWriteArrayList 复制到经典 ArrayList,如何?

已经尝试过正常分配并且:

抛出:

有没有办法将 COWArrayList 复制到普通的 ArrayList 中?

0 投票
2 回答
243 浏览

java - ArrayList,检查 2 个线程的大小

我有一个清单:

ArrayList 列表 = 新的 ArrayList<>();

在第一个线程上我添加元素(它很快 - 30/秒)在第二个线程上我读取它的大小并打印到文件。

第一个线程:

第二个线程:

它是文件的输出,只有一部分:1 1 1 3 3 5 4 6 7 7 9 11 8 9 12 10 14 16

这是错误的,因为它应该只会增加。可以有 1 1 1,但不能有 11 8。

我的程序很大,但这些只是这个列表的出现(我已经删除了一半的代码来调试它)。list.remove()整个应用程序中没有等。

我有一个问题:这可能吗,它的行为是这样的吗?否则 - 这是我在代码中某处的错。

是的,我已经尝试过 CopyOnWriteArrayList - 同样的事情。谢谢!