Java 并行编程技术,优缺点

Java 并行编程技术,优缺点,java,.net,concurrency,erlang,Java,.net,Concurrency,Erlang,创建并发应用程序至少有三种众所周知的方法: 通过锁定(.NET,Java)实现多线程和内存同步。软件事务内存()是另一种同步方法 异步消息传递(Erlang) 我想了解是否还有其他方法,并讨论这些方法应用于大型分布式应用程序的各种优缺点。我的主要关注点是简化程序员的生活 例如,在我看来,当多个线程之间没有依赖关系时,使用多个线程是很容易的,这是非常罕见的。在所有其他情况下,线程同步代码变得相当麻烦,难以调试和推理 Read’s专栏,你也会受到启发。我强烈推荐阅读Rich Hickey的文章。它描

创建并发应用程序至少有三种众所周知的方法:

  • 通过锁定(.NET,Java)实现多线程和内存同步。软件事务内存()是另一种同步方法

  • 异步消息传递(Erlang)

  • 我想了解是否还有其他方法,并讨论这些方法应用于大型分布式应用程序的各种优缺点。我的主要关注点是简化程序员的生活


    例如,在我看来,当多个线程之间没有依赖关系时,使用多个线程是很容易的,这是非常罕见的。在所有其他情况下,线程同步代码变得相当麻烦,难以调试和推理

    Read’s专栏,你也会受到启发。

    我强烈推荐阅读Rich Hickey的文章。它描述了一种构建高性能并发应用程序的方法,我认为这种方法不同于基于锁或消息传递的设计

    它基本上强调:

    • 无锁、多线程并发应用程序
    • 不变的持久数据结构
    • 软件事务内存处理的状态更改

    并讨论这些原则如何影响语言的设计。

    使用Java 5并发API,只要您利用高级实用程序并正确使用它们,用Java进行并发编程就不必繁琐和困难。我发现Brian Goetz的《Java并发实践》一书是关于这一主题的优秀读物。在我的上一份工作中,我使用了本书中的技术,使一些图像处理算法扩展到多个CPU,并将CPU和磁盘绑定的任务流水线化。我发现这是一次很棒的经历,我们取得了优异的成绩

    或者如果你使用C++,你可以试试OpenMP,它使用了γ-语用指令来使循环并行,虽然我自己从来没有使用过。

    • 带锁的共享内存

      构造(锁)用于 限制对共享资源的访问。 通常需要硬件支持 从内存系统中,在 特别说明。这种方法可能存在的缺点包括:开销、内存系统中的争用点、调试困难,尤其是在进程数量巨大的情况下

    • 软件事务存储器

      内存被视为数据库, 事务在哪里决定要做什么 写什么,什么时候写。这里的主要问题 由可能的 争论和争论的数量 失败的事务尝试

    • 期货、承诺及类似事项

      其基本思想是未来是一个整体 已完成的计算结果 外包到不同的流程 (可能在不同的CPU上或 机器)并且可以传递 和其他物体一样。万一 可能会出现网络故障问题

    • 消息传递

      同步或异步,在 二郎风格


    在列表中再添加一个:软件事务内存()。还有一个Java版本可用:作为子项添加到1)。从概念上看,它不像是编写并发应用程序的一种新方法,而是作为锁定结构的替代方法。@Serge:我不知道为什么它在概念上与消息传递的区别更小。@Neeme:也是关于STM的,请参阅DeuceSTM。@jalf:我不认为它会以任何剧烈的方式改变应用程序体系结构。它仍然依赖于线程和内存同步。我不确定事务语义是否比锁更容易处理共享状态。就我个人而言,我对试图避免共享状态的概念非常感兴趣。请注意,并行和并发不是同义词。tbb还为提供了
    parallel\u、
    parallel\u映射
    parallel\u reduce
    ,但对并发性没有帮助。类似地,也有像Newsquak这样的语言是面向并发的,但不提供并行处理。+1,好书和建议-现在很少需要使用Java中的低级原语编写复杂的线程安全代码。审查和推理使用这些较新API的代码也容易得多。Microsoft发布了带有.NET 4.0的TPL,这是一组类似于Java的线程的高级抽象。虽然它确实简化了令人尴尬的并行问题的编码,但它对管理共享状态并没有多大帮助,反而给人一种简单的错误印象。很好的发现。虽然我很欣赏他对线程同步的深入研究,但他主要关注线程、锁定和原子操作,这只是并发的众多方法之一。他在几篇文章中提到了异步消息传递,但IMHO并没有走得很远。此外,他的文章还说明了正确使用多线程是多么困难。我仍然在做关于各种内存模型的噩梦。是的,Sutters专栏的重点是使传统的基于锁的同步更易于管理,而不是探索其他技术。不过还是一本不错的书。