java - 在多线程编程中,同步是否剥夺了并发执行的好处

标签 java multithreading concurrency

我对在我正在处理的应用程序中使用多线程感到进退两难。我有一个工作流,其中对象的状态发生变化,这对单线程操作没有任何问题。但是,为了提高性能,我打算使用多线程。

我的理解是,由于状态要在线程之间共享,所以每个线程在执行前都必须获取状态锁,这不是违背了多线程的目的吗?似乎多线程不会产生任何实际的并发性,因此它不会比单线程好多少。

我的分析正确吗?如果我误解了,那么有人可以澄清一下这个概念吗?

最佳答案

简短的回答:并发很难。具有多个并发编写器的真正并发真的很难。

您需要确定的是您的实际一致性保证需要是什么。是否每个读者都需要能够看到每一个写入,保证?然后你将被迫进入linearizing所有线程都以某种方式(例如使用锁)——您的下一步工作应该是确保您在锁之外做尽可能多的工作,以尽可能短地保持锁。

将锁保持尽可能短时间的一种方法是使用 lock-free algorithm .大多数无锁算法都基于原子比较和设置原语,例如 java.util.concurrent.atomic 包提供的原语。这些可以是非常高性能的,但设计一个成功的无锁算法可能很微妙。一种简单的无锁算法是只构建一个新的(不可变的)状态对象,然后以原子方式使其成为“Activity ”状态,如果在此期间另一个作者使不同的状态成为 Activity 状态,则在循环中重试。 (这种方法对于许多应用程序来说已经足够好了,但是如果你有太多的编写器,它很容易受到活锁的影响。)

如果您可以通过更宽松的一致性保证来解决问题,那么许多其他优化都是可能的。例如,您可以使用线程本地缓存,以便每个线程都能看到自己的数据 View 并可以并行写入。然后您需要处理数据过时或不一致的后果。这方面的大多数技术都争取 eventual consistency : 写入可能不会立即对所有读者可见,但保证最终对所有读者可见。

这是一个活跃的研究领域,一个完整的答案可以写一本书(真的,好几本书!)。如果您刚刚开始涉足该领域,我建议您阅读 Java Concurrency in Practice由 Goetz 等人撰写,因为它很好地介绍了该主题,并提供了许多有关如何成功构建并发系统的实用建议。

关于java - 在多线程编程中,同步是否剥夺了并发执行的好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43813956/

相关文章:

java - Spring - 未找到 JWTParser(String)

c - P线程介绍

ios - 在后台检测可达性

multithreading - 什么是竞争条件?

java - Hibernate 为 MySQL 生成错误的内部连接查询

java - 对 For 循环中的数字求和

java - 2 个线程和 2 个 JTextArea

java - 从特定方法调用时,JFrame 中的内容不显示

java - 由于 JPanel 实现了 ActionListener,paintComponent() 和 actionPerformed() 不同步

java - 除了 in 之外,还有其他工具可以查看本地 derby 数据库(文件夹)吗?