问题标签 [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.
java - 暴露内部集合项时应该使用 Iterator 还是 Iterable ?
我有一个带有私有可变数据列表的类。
我需要在以下条件下公开列表项:
- 列表不应在外部修改;
- 使用 getter 函数的开发人员应该清楚,他们得到的列表是不能修改的。
应将哪个 getter 函数标记为推荐方法?或者您能提供更好的解决方案吗?
UPD:这个问题来自关于 list getter implementation 最佳实践的真实代码审查讨论
java - 从 ActiveMQ DestinationSource.getQueues 响应中正确迭代队列
出于某种原因,在以下代码中,destinationSource.getQueues()
返回的是 aCopyOnWriteArraySet
而不是简单的Set
. 这是一个问题,因为 for 循环在满之前开始处理,Set
并且由于它的性质,CopyOnWriteArraySet
它只会处理Set
before 循环中的项目。我知道我可以Thread.sleep()
在那里扔一个,但这并不能解决根本问题。是否有任何理由将其作为 aCopyOnWriteArraySet
而不是 a返回Set
?还有什么方法可以迭代 aCopyOnWriteArraySet
以确保覆盖所有项目,即使是在迭代期间添加的项目?
编辑:这是我提出的解决方案,虽然它并不完美,但它确保您将获得所有队列,直到添加队列之间的时间超过 1 秒。
java - CopyOnWriteArrayList - 如何更新堆栈?
在 的情况下CopyOnWriteArrayList
,只要将元素添加到集合中,就会创建一个新对象。
考虑下面的例子:
每次添加元素时,都会创建一个新对象,并且playersUsing2
堆栈上的引用将更新为指向该内存位置。可以理解。
现在,我传递playersUsing2
给另一个方法,因此将创建一个新的堆栈帧,并且playersUsingNew
还将指向相同的内存位置。并且当添加新元素时,将创建一个新对象并将playersUsingNew
指向新的内存位置。
但是如何playersUsing2
更新第一个堆栈帧以指向最新的内存位置?
我看到了java.util.concurrent.CopyOnWriteArrayList.add(E)
实现,但无法理解。是不是通过一些本机代码和JVM来处理,它是怎么发生的?
输出:
java - CopyOnWriteArrayList 太慢了
我有以下情况,
输出
与大约花费的时间相比,它添加元素非常缓慢。我在文档中知道了原因,ArrayList
0.004690843
一种线程安全的变体,
ArrayList
其中所有可变操作(添加、设置等)都是通过制作底层数组的新副本来实现的。
所以,我的理解是,每当我在这个列表中添加新元素时,它都会创建新的新数组并在这个数组的最后一个索引处添加元素。我找到了一个锁定add
方法,除此之外,该方法实际上每次都创建新数组。
当我增加到MAX_NUMBER
我10_00_000
的程序继续运行并且永远不会结束时(它会但我不能等待这么久)。
Collections.synchronizedList
当您希望线程安全且速度快时,我认为这是更好的选择。我用了它,它花了大约0.007673728
.
我的问题:
- 为什么它在内部创建新数组,线程安全与此有关吗?
- 为什么要花这么多时间以防万一
MAX_NUMBER = 10_00_000
?(因为它花了大约 6 秒MAX_NUMBER = 10_00_00
)发生这种情况是因为变异操作每次都会创建新数组吗? CopyOnWriteArrayList
当您拥有大量元素并且更好地选择其他东西(即)时,这是否意味着性能下降Collections.synchronizedList
?- 这就是我们通常
CopyOnWriteArrayList
在公共 API 中看不到的原因吗?除了这个还有什么缺点吗?
java - 具有原子替换的线程安全可序列化集合
当多个线程通过 RMI 访问同一服务器时,我的程序遇到问题。服务器包含一个列表作为缓存并执行一些昂贵的计算,有时会更改该列表。计算完成后,列表将被序列化并发送给客户端。
第一个问题:如果列表在被序列化(例如,由不同的客户端请求某些数据)时发生更改ConcurrentModificationException
(可能)抛出一个,导致EOFException
RMI 调用/客户端的反序列化。
因此,我需要某种列表结构,它对于序列化是“稳定的”,同时可能被不同的线程更改。
我们尝试过的解决方案:
- 常规 ArrayList / Set - 由于并发而无法正常工作
- 在每次序列化之前深度复制整个结构 - faaar 太昂贵了
CopyOnWriteArrayList
- 也很昂贵,因为它复制了列表和
揭示第二个问题:我们需要能够以原子方式替换列表中当前不是线程安全的任何元素(首先删除,然后添加(这甚至更昂贵)),或者只能通过锁定列表来实现,因此只做不同的线程按顺序排列。
因此我的问题是:
您是否知道
Collection
允许我们对serialize
Collection 线程安全的实现,而其他线程对其进行修改,and
其中包含某种方式的atomically replacing
元素?如果列表
not
需要copied
在序列化之前出现,那将是一个奖励!为每个序列化创建一个快照是可以的,但仍然是 meh :/
问题说明(C=compute,A=add to list,R=remove from list,S=serialize)
java - 如何在不覆盖 Java 中的当前内容的情况下写入外部文本文件
我正在尝试将错过的响应写入外部文本文件。以下方法将无法识别的响应存储到外部文本文件中,但会覆盖以前的内容。如何阻止它被覆盖?
//写一个列表方法
//我在这个方法中调用它
c# - 从 bytearray 中删除特定的索引范围,然后重新组合 c#
我有一个要求,我在 bytearray 中有大量数据。我想选择 39998 数据并跳过 39999,40000.40001,40002 索引,然后在此 39998 数据之后再次选择并跳过 39999,40000.40001,40002。
所以我的要求是我需要大小为 39998*12=479976 的总字节数组
我已经尝试过这个解决方案
但它改变了名单。
我需要从 1 到 39998 选择数据跳过 4 个字节,然后选择 39998 并跳过 4 个字节,依此类推,最多 12 次。然后重新组合字节数组。实际上,如果我们使用列表,它会在第二次移动索引它会出现问题(删除另一个索引)。所以如果你有其他建议,请告诉我
java - 购物车未从第二次尝试更新数量
我正在尝试使用两个 java 类来实现购物车流程。一个是CartItem
,另一个是ShoppingCart
包含购物车的所有过程。
这是我的CartItem
:
我的ShoppingCart
班级:
这是我添加产品和输出的方式:
输出:
但预期:
提前致谢。
java - 将 CopyOnWriteArrayList 复制到经典 ArrayList,如何?
已经尝试过正常分配并且:
抛出:
有没有办法将 COWArrayList 复制到普通的 ArrayList 中?
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 - 同样的事情。谢谢!