Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >ArrayLists与向量比较

ArrayLists与向量比较
EN

Stack Overflow用户
提问于 2020-09-25 08:53:32
回答 2查看 58关注 0票数 1

在一个赋值问题中,有人问当有多个线程访问和修改it.If时,使用and ArrayList是否合适,而不是问什么是最好的方法

我知道ArrayLists是不同步的,所以这意味着在性能方面,使用ArrayLists是个不错的选择

但由于多线程修改和访问它,我认为数据的完整性可能不安全,所以从这个角度来看,我认为在考虑数据完整性时向量更合适,因为向量是同步的。

我想知道我的建议是否correct.Or ArrayLists在上述情况下是最好的

EN

回答 2

Stack Overflow用户

发布于 2020-09-25 09:03:51

如果你使用的是Vector,它在同步时总会有一些开销。ArrayList不是那么安全,但是对于你的线程,你可以自己做同步,例如使用同步的对象或者:

代码语言:javascript
代码运行次数:0
复制
Collections.synchronizedList(new ArrayList<String>());

然后,您仍然可以在线程任务完成后访问ArrayList,而不会产生向量的开销。如果你只在线程中使用列表,我想Vector也是一个很好的选择。我尽量避免使用Vector。

票数 1
EN

Stack Overflow用户

发布于 2020-09-28 01:53:33

我只有英特尔的线程构建块和微软的并行模式库中的concurrent_vector的经验,但我认为它们可能可以与Java的Vector相媲美。

从我的测试来看,两者中的concurrent_vector都比大多数替代方案慢得多,比如执行多个线程并在本地线程不安全的容器(如C++中的std::vector )中收集结果,然后将结果附加到锁中的共享集合中,或者创建一个列表列表,每个线程写入自己的列表(使用一些数组索引),然后以串行方式在结束时将结果组合到一个列表中。

据我所知,线程安全版本的好处是方便。我从来没有发现过并发的、线程安全的随机访问序列,即使是在Intel自己的库中,我也无法用线程不安全的替代方案来击败它。在线程不安全的替代方案中,我在一个线程中本地累积结果,然后使用一些基本的线程同步,并在一个线程中以串行方式组合结果。如果我的测试是写繁重的,那么我通常可以用这种粗糙的方法比并发容器快2-3倍的结果。

也就是说,在许多情况下,您的时间实际上偏向于向容器写入/附加元素,这种情况可能很少见。更多的时候,我发现我在现实世界中的大部分线程案例都花在了阅读和处理数字之类的事情上,只有一小部分时间花在了将结果推到容器的后面。因此,通常情况下,并发容器的开销开始变得可以忽略不计,而且它肯定要方便得多,而且跨线程误用的可能性也要小得多。

在可能很少见的情况下,写入容器是并行算法中花费的大量时间,在我的测试和经验中,并发容器从未为原始替代方案提供性能优势。因此,如果这是一个特别关键的代码部分,并且您在性能分析会话中看到并发容器方法中的热点,我会尝试在非并发的线程本地容器(即线程本地ArrayList)中累积输出,然后在算法结束时(例如:组合ArrayList)以串行方式从一个线程或在锁/临界区中组合它们的所有结果。

不幸的是,让它既是线程安全的,又是可伸缩的,这是很棘手的。只需在一个线程中执行所有操作,就可以在架构中最大限度地实现线程安全。线程安全问题解决了!但这根本不能扩展到利用并行性的优势。我发现了这样的并发性--一种与Amdahl定律正面相撞的平衡行为。我发现并发容器处于中等水平,因为使用它们几乎总是在某种程度上牺牲最佳性能,但最佳和非最佳之间的差异可能可以忽略不计。好的,你测量一下,就像我看到的那样。

至于你问题的这一部分:

,但由于多线程修改和访问它,我认为数据的完整性可能不安全

从我的角度来看,这是与设计相关的。我从理论角度思考计算机科学已经有很长一段时间了,但在这个概念中有一个隐含的假设,即这些数据必须共享。根据用户端需求,数据可能需要共享,也可能不需要共享。以从scene访问数据的视频游戏为例。看起来渲染引擎和物理引擎等等都必须共享同一个场景。这是很有道理的。这对人类来说是有意义的。

然而,情况并不一定是这样。从用户端的角度来看,如果渲染器有自己的场景副本,用于将结果渲染到屏幕上,这可能并不重要,这可能与正在进行的其他事情略有不同步。因此,通常情况下,至少在需要最佳性能或帧率或最小等待时间的情况下,您可以复制/复制数据,以允许线程尽可能快地运行,而不需要访问共享数据所需的任何线程同步(包括排除原子操作)。这可以通过持久化数据结构和类似的东西变得非常复杂。这取决于设计。但我认为多线程编程的一个违反直觉的方面是,我们首先倾向于认为需要在线程之间共享的东西比它们真正需要共享的东西更多,而抛弃这种假设可能会产生全新的并行性。我和我的许多同事和我自己发现,拥有触手可及的并发容器会诱使我们在线程之间共享比实际需要更多的数据。如果我们的目标是尽可能有效地利用硬件,那么尽可能多地放弃共享数据的概念通常是有意义的,包括这些并发容器。实际上,如果你的软件像游戏引擎一样对性能至关重要,我会建议尽量减少它们的使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64060907

复制
相关文章
如何配置Seata以便与应用程序集成?
Seata是一款开源的分布式事务解决方案,可以为分布式应用程序提供事务管理和协调功能。为了实现Seata与应用程序的集成,需要进行如下几个步骤:
用户1289394
2023/09/11
3010
如何配置Seata以便与应用程序集成?
页面参数传递
在doctor_ask.html页面,把在url中的参数取下来,要使用一个方法getQueryString(),其中有一个方法是用来获取url中含有中文参数的:
一觉睡到小时候
2019/07/03
3.2K0
Angular2 页面的生命周期
当被绑定的输入属性的值发生变化时调用,首次调用一定会发生在 ngOnInit之前。
用户1437675
2018/08/20
6980
错误页面定制与视图传递多个参数
一、错误页面定制 视图函数 <span class="hljs-meta">@app.errorhandler(404)</span> <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">page_not_found</span><span class="hljs-params">(e)</span>:</span> <span class="hljs-keyword">
星哥玩云
2022/09/14
1K0
利用fluorineFx将DataTable从.Net传递到Flash
FluorineFx自带的示例都不错,就是有点不简洁,下面的代码基本上已经最简版了(环境vs2010) 1、先创建一个Web Application,然后添加FluorineFx以及FluorineFx.ServiceBrowser的引用 这二个程序集的默认位置在: C:\Program Files (x86)\FluorineFx\Bin\net\3.5\FluorineFx.dll C:\Program Files (x86)\FluorineFx\Bin\net\3.5\FluorineFx.Serv
菩提树下的杨过
2018/01/23
2.4K0
利用fluorineFx将DataTable从.Net传递到Flash
使用Helm将应用程序部署到IBM Cloud上的Kubernetes
Helm是Kubernetes的包管理器。借助Helm,您可以非常方便地将应用程序,工具和数据库(如MongoDB,PostgreSQL,WordPress和Apache Spark)部署到您自己的Kubernetes集群中。以下简要介绍如何将Helm用于IBM Cloud Container服务。
johnniang
2018/01/15
2K0
使用Helm将应用程序部署到IBM Cloud上的Kubernetes
本文介绍了如何使用Helm将应用程序部署到IBM Cloud上的Kubernetes,包括详细的步骤和示例。
Techeek
2018/01/08
1.6K0
angular2 路由之间的页面跳转
angular2路由页面之间的跳转, 只需要在需要跳转的ts文件中引入 import {Router} from '@angular/router'; 然后在 constructor(public router:Router) { } 定义好router,这样就可以使用Router中的属性了 doJump(){     this.router.navigate(['/index'])//跳转到新的路由页面 } so easy吧!
杭州前端工程师
2018/06/15
3.3K0
如何将Redux与React Hooks一起使用
React Redux在2019年6月11日发布的7.1版中提供了对Hooks的支持。这意味着我们可以在函数组件中将Redux与Hooks一起使用,而不是使用高阶组件(HOC)。
前端知否
2020/03/23
7K0
如何将Redux与React Hooks一起使用
将Spring Boot应用程序部署到Bluemix
在之前的博客文章中,我介绍了如何通过Swagger在Spring Boot应用程序中记录REST API。下面我将介绍如何将这些应用程序作为Docker容器部署到IBM Bluemix。作为例子,我再次使用Spring REST示例。在之前的博客文章中,我介绍了如何通过Swagger在Spring Boot应用程序中记录REST API。下面我将介绍如何将这些应用程序作为Docker容器部署到IBM Bluemix。作为例子,我再次使用Spring REST示例。
FLYMOTH
2018/01/15
2.5K0
将Spring Boot应用程序部署到Bluemix
将Spring Boot应用程序部署到Bluemix
在之前的博客文章中,我介绍了如何通过Swagger在Spring Boot应用程序中记录REST API。下面我将介绍如何将这些应用程序作为Docker容器部署到IBM Bluemix。我会再次使用S
johnniang
2018/01/08
2.4K0
将Spring Boot应用程序部署到Bluemix
将Spring Boot应用程序部署到Bluemix
在之前的博客文章中,我介绍了如何通过Swagger在Spring Boot应用程序中记录REST API。下面我将介绍如何将这些应用程序作为Docker容器部署到IBM Bluemix。我将再次使用S
电工昌威
2018/01/05
2.4K0
将Spring Boot应用程序部署到Bluemix
Angular2 组件(页面)之间如何传值
在Angular 2中,数据和事件变化检测从上到下发生从<b>父级到子级。</b>
用户1437675
2018/08/20
4K0
Angular2 组件(页面)之间如何传值
使用Helm将应用程序部署到IBM Cloud上的Kubernetes上
本文介绍了如何使用Helm将应用程序部署到IBM Cloud上的Kubernetes集群中。首先介绍了Helm的作用和如何使用Helm部署应用程序,然后详细说明了如何在IBM Cloud上使用Helm部署MongoDB。最后,提供了如何获取IP地址和端口的示例。
shaonbean
2018/01/09
1.3K0
将WordPress发布到静态GitLab页面站点
通过 GitLab 或 GitHub Pages 来提供一个 WordPress 镜像站点, 从而最小化安全问题。
星哥玩云
2022/07/14
6510
Angular2 VS Angular4 深度对比:特性、性能
在Web应用开发领域,Angular被认为是最好的开源JavaScript框架之一。
葡萄城控件
2022/05/09
8.7K0
Angular2 VS Angular4 深度对比:特性、性能
将windows应用程序注册为windows服务
@echo off ::设置服务名称 set service_name=ServiceManagement ::设置服务描述 set service_description=文件安全上传服务 ::设置服务程序路径 set prog_path=%cd:\=\\%\\ServiceManagement.exe ::设置服务的启动方式 auto:自动 demand:手动 disabled:禁用 set strt=auto echo EasyService 一键服务 echo =========================================================== ::pause ::======================以下部分勿随意修改========================== set s32=%cd%\system32 set reg_file=EasyService.reg net stop %service_name% 2>nul
FreeTimeWorker
2020/08/31
1.4K0
Meteor 微信公共号开发将客户端日志传递到服务端打印
因为在微信客户端环境,我们无法使用 console.log 查看前端显示的一些调试信息,如果需要用到调试,我们一般是使用 Session 方法来给前端一个固定专门显示日志的变量设定属性,这样这个固定的变量会跟随 Session.set 设定的值而变化。后面想了一个比较方便的办法,直接将客户端需要输出的日志信息通过 Meteor.call 发送到服务端打印我们就可以方便的在服务端一起看到server log 和 client log 了。
我与梦想有个约会
2023/10/20
1870
Meteor 微信公共号开发将客户端日志传递到服务端打印
将静态页面部署到github.io
  我的腾讯云服务器是之前利用学生身份(有优惠)买的,现在快到期了,而且服务器上面只有一个引导页(静态页面)还有用,别的项目都没有用了。所以就想找一种不花钱买服务器就可以访问到我的引导页的方法。然后突然间想到了之前小伙伴说过hexo写博客非常方便而且是托管到github上的,我就想能不能用类似的方法把自己的静态页面也托管到github上。
lin_zone
2019/09/24
1.6K0
点击加载更多

相似问题

将参数传递给服务以便与$http.get()一起使用

32

如何将文件传递到Docker容器以便与容器一起使用?

15

将.vue发布到npm以便与browserify一起使用

11

将javascript变量传递给PHP以便与Google一起使用

15

将值从服务传递到组件(Angular2)

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文