java中的线程安全随机访问循环数组?
Posted
技术标签:
【中文标题】java中的线程安全随机访问循环数组?【英文标题】:thread safe random access circular array in java? 【发布时间】:2020-06-20 17:02:36 【问题描述】:我需要缓存并发系统的最近的结果(比如 10,000),并随机访问它们。 由于大多数并发缓存都是基于链表的,所以我想知道java中是否存在线程安全的随机访问循环数组?
【问题讨论】:
您能否详细说明您需要如何使用它?例如,Guava 的内存缓存是否适合您? 假设“随机访问”是指按索引访问?如果是这样,是按LRU顺序吗?如果是这样,你为什么需要它?你到底想达到什么目的? @Daniele 用于故障转移的本地缓存,写操作远多于读操作 @Bohemian 是的,按索引,但限制比 LRU 弱,因为它只用于故障转移 链表的锁定问题在设计良好的缓存中应该不是问题。如果您需要 LRU,那么 ConcurrentLinkedHashMap 或 Guava's Cache 就足够了。如果您可以利用更智能的驱逐策略,那么Caffeine 是首选。见benchmarks。 【参考方案1】:对于没有超时的缓存,我经常使用ConcurrentHashMap
。你也可以看看CopyOnWriteArrayList
。
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html
【讨论】:
根据文档,当遍历操作大大超过突变时,copyOnWriteArrayList 效率更高。但是我们写的比读的多 那么你可以使用传统数组并同步访问它:List<String> list = Collections.synchronizedList(new ArrayList<String>());
以上是关于java中的线程安全随机访问循环数组?的主要内容,如果未能解决你的问题,请参考以下文章
使用数组 + for 循环时出现“线程主 java.lang.arrayindexoutofboundsexception 中的异常”