Questions tagged «concurrency»

并发是其中多个进程同时执行的系统的属性。

4
乐观锁定不起作用怎么办?
我有以下这种情况: 用户向GET请求/projects/1并接收ETag。 用户从步骤1 开始使用ETag 进行PUT请求/projects/1。 用户/projects/1从步骤1 开始使用ETag 发出另一个PUT请求。 通常,第二个PUT请求将收到412响应,因为ETag现在已过时-第一个PUT请求修改了资源,因此ETag不再匹配。 但是,如果同时发送两个PUT请求(或者一个又一个发送)怎么办?在PUT#2到达之前,第一个PUT请求没有时间处理和更新资源,这导致PUT#2覆盖PUT#1。乐观锁定的全部目的是要避免这种情况的发生。

4
当您无法添加唯一索引时,有哪些可能的方法来避免重复
我陷入了并发问题。 用户发送2 o 3事务来保留某些不应在数据库中重复的数据是一个典型的问题,如果有重复的记录,您应该返回一个错误。 当您仅可以向存储哈希的列添加索引(唯一)时,此问题就很容易。 但是在这种情况下,我有一个巨大的表(可能有数百万条记录),而我不能只修改该表。 实际上,我们有一列存储数据的散列,该散列不应重复但未设置唯一索引。 我正在尝试在我的Java代码上检查是否在刷新之前存在,仍然会重复。 我对此可能的解决方案是: 创建一个触发器,以检查我要插入的哈希表上是否已经存在。 创建另一个表来存储该表的唯一索引,并将外键添加到主表。 坐在胎位上哭


3
寻找分布式锁定模式
我需要为C#中的分布式系统提出一个自定义的递归对象锁定机制\模式。本质上,我有一个多节点系统。每个节点对n个状态段具有独占写入权限。至少一个其他节点上的只读也可以使用相同的状态。一些写入/更新必须在所有节点上都是原子的,而其他更新最终将通过后台复制过程,队列等变得一致。 对于原子更新,我正在寻找一种模式或示例,这些模式或示例可以有效地使我将对象标记为写锁定,然后可以分发,提交,回滚等。由于系统具有高级别的并发性,因此我假设我需要能够堆叠锁,这些锁要么超时,要么在释放锁之后展开。 事务或消息传递不是这个问题的重点,但是我已经为一些额外的上下文提供了它们。话虽如此,请随意阐明您认为需要的消息。 尽管我对实现全新产品不愿接受任何新想法,但是这是我所设想的模糊示例 thing.AquireLock(LockLevel.Write); //Do work thing.ReleaseLock(); 我在考虑使用扩展方法,可能看起来像这样 public static void AquireLock(this IThing instance, TupleLockLevel lockLevel) { //TODO: Add aquisition wait, retry, recursion count, timeout support, etc... //TODO: Disallow read lock requests if the 'thing' is already write locked //TODO: Throw exception when aquisition fails instance.Lock = lockLevel; } …

1
当异步任务使用户体验不佳时
我正在编写一个COM插件,该插件扩展了迫切需要它的IDE。这里涉及许多功能,但是为了这篇文章,我们将其缩小到2: 有一个“代码资源管理器”工具窗口,其中显示一个树状视图,允许用户浏览模块及其成员。 有一个“代码检查”工具窗口,其中显示一个datagridview,可让用户浏览代码问题并自动修复它们。 两种工具都有一个“刷新”按钮,用于启动异步任务,该任务将解析​​所有打开的项目中的所有代码。该代码浏览器使用的解析结果建立树形视图和代码评审使用的解析结果,以找出代码问题并显示其结果的datagridview。 我在这里想要做的是在功能之间共享解析结果,以便在代码浏览器刷新时,代码检查会知道它并可以刷新自身,而无需重做代码浏览器刚刚进行的解析工作。 因此,我做了什么,将解析器类设置为事件提供者,这些功能可以注册到: private void _parser_ParseCompleted(object sender, ParseCompletedEventArgs e) { Control.Invoke((MethodInvoker) delegate { Control.SolutionTree.Nodes.Clear(); foreach (var result in e.ParseResults) { var node = new TreeNode(result.Project.Name); node.ImageKey = "Hourglass"; node.SelectedImageKey = node.ImageKey; AddProjectNodes(result, node); Control.SolutionTree.Nodes.Add(node); } Control.EnableRefresh(); }); } private void _parser_ParseStarted(object sender, ParseStartedEventArgs e) { Control.Invoke((MethodInvoker) delegate …

2
与离线系统同步
我正在设计一个系统,通过该系统,我将同步移动设备(具有嵌入式应用程序)中的业务数据,该数据会生成数据并将其发送回服务器。同步的每一行都会在数据库中生成特定的业务日志。 如果我同步的数据生成的日期(在同步数据内)晚于我的业务数据的最后修改日期,则我必须忽略它,而只需在数据库中添加日志即可。处理上载的数据后,将从数据库中获取数据并将其下载到设备。 由于写完后立即下载,同步必须是同步的。如果像这样的东西足以取代我现有的解决方案,那么仍然有可能采用读写器模式。更重要的是能够下载最新数据。该数据是整体获取的,目前没有实现差异(它可能会在以后出现,但这不会成为问题)。 我可能在同一个业务对象上运行多个同步,这不太可能,但是可能会发生,我希望能够处理它。除非使用嵌入式移动应用程序几天不重新同步,否则预计同步将持续几秒钟但不会持续几分钟。 同步处理的数据量预计不会很大。 因此,我最终在我的同步方法上使用了互斥,更确切地说,我正在使用Java,并且在写入方法上放置了同步,而不是整个同步过程都放在不阻止只读同步的位置。 我想知道 : 这样是否有意义?只要同步过程的数量和时间仍然可以接受。 一般来说,我应该看什么概念。奖励:Spring模块中是否有这些概念的实现。

2
为什么Akka对并发有好处?
我是Akka和actor框架的新手-我确信我缺少明显的东西,请提前接受我的道歉。 我一直在读,选择Akka的主要要点之一是它管理并发的方式。 我不清楚Akka为什么如此特别。我知道有很多小演员非常轻快。但是,当两个用户同时保存一个表单时,这对我有什么帮助? 我是否还需要某种并发锁(悲观/乐观/等等)?

3
REST是否仅限于乐观并发控制?
语境 由于REST体系结构样式的无状态性(涉及每个请求完全独立),导致服务器从不存储有关客户端的任何信息。 因此,悲观并发控制不合适,因为这将要求服务器存储哪个客户端获得资源锁定。然后在Etag标头的帮助下使用乐观并发控制。(顺便说一句,正如我在那儿问的/programming/30080634/concurrency-in-a-rest-api) 问题 乐观并发控制机制的主要问题在于,您始终允许所有客户端执行任何操作。 我想避免这种情况,而不会破坏REST的无状态原则。我的意思是,所有客户端都无法随时执行任何操作。 题 在我看来,采用半乐观并发控制机制是可能的,例如: 客户可以请求令牌 只能生成一个令牌,并且有效期有限 要对资源(例如POST或PUT)执行操作,客户端必须将此令牌作为请求正文(或标头?)的一部分提供。没有令牌的客户端无法执行这些操作。 它与开放式并发控制非常相似,不同之处在于,只有一个客户端可以执行某些操作(获得令牌的操作)……与“所有客户端可以执行所有操作”相反。 这种机制是否与REST架构风格兼容?它打破了它的任何约束吗?我当时想问一下SO,但这似乎是一个与软件设计有关的高级问题。

3
建议使用哪些资源来了解并发系统的Actor模型?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 6年前关闭。 Actor并发模型显然正在受到青睐。有没有一本很好的书介绍了模型的模式和陷阱?我正在考虑一些可以讨论的问题,例如,在成百上千的独立参与者的背景下,一致性和正确性问题。 如果它与一种特定的语言关联(我想,Erlang,因为它似乎被普遍认为是Actors的公认实现),那将是可以的,但是我希望除了介绍性的一两个章节之外还可以。实际上,我对Actor最感兴趣,因为在Scala中实现了Actor(如果有可用的资源)。

6
并发中的下一个
在过去的一年中,我一直致力于Java并发方面的工作,并且已经构建并处理了许多并发包。因此,就并发世界的发展而言,我很有信心。此外,我非常有兴趣学习和了解有关并发编程的更多信息。 但是我无法回答自己下一步该怎么办?我应该学习或从事哪些额外工作,以继承更多与多核处理相关的技能。是否有与多核处理相关的好书(阅读并喜欢“实践中的并发性”和“ Java并发编程”)或与多核处理相关的资源,这样我就可以进入下一个级别了?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.