精华内容
下载资源
问答
  • 两种高效并发模式

    千次阅读 2017-05-25 15:01:07
    并发编程的目的是让程序”同时”执行多个任务。如果程序是计算密集型的,并发编程并没有什么优势,反而由于任务的切换使效率降低。但如果程序是I/O密集型的,那就不同了。 I/O操作通常分为两个阶段,即等待和数据...

    并发编程的目的是让程序”同时”执行多个任务。如果程序是计算密集型的,并发编程并没有什么优势,反而由于任务的切换使效率降低。但如果程序是I/O密集型的,那就不同了。
    I/O操作通常分为两个阶段,即等待和数据搬迁,通常等待所花费的时间比较多。而I/O操作的速度远远低于CPU的计算速度,所以让程序阻塞在I/O操作将浪费大量的时间。如果程序有多个执行线程,则当前被I/O操作阻塞的线程可以放弃CPU,并将执行权限转移到其他线程。这样一来,CPU就可以做更多的事情了。
    并发模式是指I/O处理单元和多个逻辑单元之间协调完成任务的方法,服务器主要有两种并发编程模式:半同步/半异步(half-sync/half-async)模式和领导者/追随者(Leader/Followers)模式。

    一、半同步/半异步模式
    1、半同步/半异步中的同步和异步
    在半同步/半异步模式中的”同步”和”异步”与I/O模型中的同步和异步是完全不相同的两个概念。在并发模式中,”同步”指的是程序完全按照代码序列的顺序执行,”异步”指的是程序的执行需要系统事件来驱动。常见的系统事件的驱动包括中断、信号等。
    例:
    这里写图片描述

    这里写图片描述

    2、同步线程和异步线程
    按照同步方式运行的线程称为同步线程,同步线程的效率比较低,实时性查,但是逻辑简单。
    按照异步方式运行的线程称为异步线程,异步线程的效率比较高,实时性强,但是异步方式执行程序比较复杂,难于调试和扩展,不适合大量的并发。
    因此对于服务器这种即要求较好的实时性,又要求并发性的应用程序,同时使用同步线程和异线程是一种比较好的模式。

    3、半同步/半异步模式
    在半同步/半异步模式中,同步线程用于处理客户逻辑,异步线程用于处理I/O事件。异步线程监听到客户请求之后就将其封装成请求对象并插入到请求队列中。请求队列将通知某个工作在同步模式的工作线程来读取并处理该请求对象。

    工作流程:
    这里写图片描述

    4、半同步/半反应堆模式(half-sync/half-reactive模式)
    半同步/半反应堆模式是半同步/半异步模式的一种变体。
    其结构如下图:
    这里写图片描述

    在上图中,异步线程只有一个,由主线程充当,负责监听socket上的事件。如果监听socket上有新的连接请求到来,主线程就接受新的连接socket,然后往epoll内核事件表中注册该socket上的读写事件。如果连接socket上有读写事件发生,即有新的客户请求到来或有数据要发送至客户端,主线程就将该连接socket插入到请求队列中,所有工作线程都睡眠在请求队列上,当有任务到来时,他们通过竞争来获取任务的接管权。
    由于主线程插入请求队列中的任务是就绪的连接socket,所以该半同步/半反应堆模式所采用的事件处理模式是Reactor模式,即工作线程要自己从socket上读写数据。当然,半同步/半反应堆模式也可以用模拟的Proactor事件处理模式,即由主线程来完成数据的读写操作,此时主线程将应用程序数据、任务类型等信息封装为一个任务对象,然后将其插入到请求队列。

    半同步/半反应堆模式的缺点:
    主线程和工作线程共享请求队列,因而请求队列是临界资源,所以对请求队列操作的时候需要加锁保护。
    每个工作线程在同一时间只能处理一个客户请求。如果客户数量增多,则请求队列中堆积任务太多,客户端的响应会越来越慢。如果增多工作线程的话,则线程的切花也将消耗大量的CPU时间。

    5、高效的半同步/半异步模式
    在半同步/半反应堆模式中,每个工作线程同时只能处理一个客户请求,如果并发量大的话,客户端响应会很慢。如果每个工作线程都能同时处理多个客户链接,则就能改善这种情况,所以就有了高效的半同步/半异步模式。
    其结构如图:
    这里写图片描述

    主线程只管监听socket,当有新的连接socket到来时,主线程就接受连接并返回新的连接socket给某个工作线程。此后该新连接socket上的任何I/O操作都由被选中的工作线程来处理,直到客户端关闭连接。当工作线程检测到有新的连接socket到来时,就把该新的连接socket的读写事件注册到自己的epoll内核事件表中。
    主线程和工作线程都维持自己的事件循环,他们各自独立的监听不同事件。因此在这种高效的半同步/半异步模式中,每个线程都工作在异步模式中,所以它并非严格意义上的半同步/半异步模式。

    二、领导者/追随者模式(Leader/Followers)
    1、什么是领导者/追随者模式
    领导者/追随者模式是多个工作线程轮流获得事件源集合,轮流监听、分发并处理事件的一种模式。
    2、领导者/追随者模式的执行流程
    在任意时间,程序都仅有一个领导者线程,他负责监听I/O事件。
    而其他线程则都是追随者,他们休眠在线程池中等待成为新的领导者。
    当前的领导者如果检测到I/O事件,首先要从线程池中推选出新的领导者线程,然后他自己去处理I/O事件。
    新的领导者等待新的I/O事件。
    处理I/O事件的线程处理完毕之后,就会变成一个追随者,直到再次被唤醒。

    3、领导者/追随者模式中线程的角色
    L/F模式中线程所担任的角色有三种,领导者、追随者、工作者。
    领导者:负责监听I/O事件,等到事件到来之后要在线程池中选出一个新的领导者。
    追随者:休眠在线程池中,等待成为新的领导者。
    工作者:当领导者检测到I/O事件之后,它立即转换成工作者,对I/O事件进行处理,处理完毕之后它会转变为追随者。
    如下图:
    这里写图片描述
    由于领导者线程自己监听I/O事件并处理客户请求,因而领导者/追随者模式不需要在线程之间传递数据。也不需要像半同步/半异步模式那样同步对请求队列的访问。但是领导者追随者的一个明显的缺点就是仅支持一个事件源集合,因而无法让每个工作线程同时管理多个客户连接。
    4、领导者/追随者模式的缺点
    极端情况下,当所有线程都变为工作者忙于处理客户端的请求,没有线程担任领导者的角色,此时客户端的请求会被拒绝。

    展开全文
  • 具有可控模式高效并发功率放大器
  • 半同步/半异步模式、半同步/半反应堆模式、相对高效的半同步/半异步模式、领导者/追随者模式


    并发编程的目的是为了让程序“同时”执行多个任务。并发编程对计算精密型没有优势,反而由于任务的切换使得效率变低。如果程序是I/O精密型的,比如经常读写文件、访问数据库等,则情况就不同了。由于I/O操作远没有CPU的计算速度快,所以让程序阻塞于I/O操作将浪费大量的CPU时间。如果程序有多个线程,则当前被I/O操作阻塞的线程可主动放弃CPU(或由操作系统来调度),将执行权转给其它线程。这样一来,CPU就可以用来做更加有意义的事情(除非所有线程都同时被I/O操作所阻塞),而不是等待I/O操作完成,因此CPU的利用率显著提升

    从实现上说,并发编程主要有多进程和多线程两种方式。

    并发模式是指I/O处理单元和多个逻辑单元之间协调完成任务的方法,服务器主要有两种并发编程模式:

    展开全文
  • 并发编程模式

    千次阅读 多人点赞 2019-07-31 20:12:05
    一、future模式 在网上购物时,提交订单后,在收货的这段时间里无需一直在家里等候,可以先干别的事情。类推到程序设计中时,当提交请求时,期望得到答复时,如果这个答复可能很慢。传统的是一直等待到这个答复收到...

    一、future模式

    在网上购物时,提交订单后,在收货的这段时间里无需一直在家里等候,可以先干别的事情。类推到程序设计中时,当提交请求时,期望得到答复时,如果这个答复可能很慢。传统的是一直等待到这个答复收到时再去做别的事情,但如果利用Future设计模式就无需等待答复的到来,在等待答复的过程中可以干其他事情。

    future模式核心思想就是异步调用,去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑。

    下面是时序图,左边是传统的单线程执行,右边使用了future模式。

     

    我们通过synchronized结合wait()和notify()、并发包下的锁都可以实现future模式,不过JDK已经为我们提供了future模式的实现,位于java.util.concurrent并发包下。

    具体使用方法可参考文章:https://www.2cto.com/kf/201411/351903.html

     

    二、Master-Worker模式

    Master-Worker 模式是常用的并行计算模式。它的核心思想是系统由两类进程协作工作:Master 进程和 Worker 进程。Master 负责接收和分配任务,Worker 负责处理子任务。当各个 Worker 子进程处理完成后,会将结果返回给 Master , 由 Master 进行归纳和总结。其好处是能将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。

     

    在Master端往往会有如下的内容:

    1、一个盛放任务的容器,一般使用队列来保证先添加的任务先执行,因为在下面参考文章的例子中,任务在main方法中被直接一口气全部提交过来,所以worker不需要在没有任务可以取的时候而阻塞等待新任务,也就是不牵涉到阻塞,所以在这里推荐使用非阻塞的线程安全队列ConcurrentLinkedQueue性能更好,参考文章中也是使用了这种队列。

    2、一个盛放worker的线程集合,worker就是用来执行任务的,所以就是个子线程,所以可以使用HashMap<String, Thread>来盛放,key是每个worker线程的标识。

    3、一个盛放任务结果的集合,和盛放worker的线程集合不同,worker的线程集合就是在初始化Master时需要指定有多少个worker的,所以是一并初始化好的,没有并发也就没有线程安全问题,而任务结果的集合会被多个worker访问,需要线程安全的容器才行,推荐ConcurrentHashMap。

    每个worker端往往会有如下的内容:

    1、Master里盛放任务的容器的引用,因为需要获取任务。

    2、Master里盛放任务结果集合,因为需要把处理完的任务结果放进去。

    Master-Worker模式的实现可参考文章:http://blog.csdn.net/lv_fq/article/details/70853315

     

    三、生产者-消费者模式

    生产者-消费者模式是一个经典的多线程设计模式。它为多线程间的协作提供了良好的解决方案。 在生产者-消费者模式中,通常由两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程则负责具体处理生产者提交的任务。生产者和消费者之间则通过共享内存缓冲区进行通信。

     

    生产者-消费者模式可以通过线程间通信的方式实现,例如通过synchronized结合wait()和notify()、并发包下的锁都可以。但最好的方式是使用阻塞队列来实现,阻塞队列又是线程安全的这样不仅高效而且实现非常简单,将阻塞队列作为存放数据的内存缓冲区,通过调用阻塞队列的阻塞方法put()和take(),开发者不需要写困惑的wait-nofity代码去实现通信。

    生产者-消费者模式的实现可参考文章:http://blog.csdn.net/yujin753/article/details/45723175

    展开全文
  • 服务器两种高性能并发模式

    1.概念

    并发目的:让程序“同时”执行多个任务。

    • 如果程序是计算密集型,并发编程没有优势,反而由于任务的切换使效率降低;
    • 如果是I/O密集型,比如经常读写文件,访问数据库,则并发编程优势很高,因为I/O操作的速度远没有CPU的计算速度快,所以程序阻塞与I/O操作将浪费大量的CPU时间。

    2.实现方式

    并发实现方式:主要有多线程和多进程两种方式;并发模式是指I/O单元和多个逻辑单元协调完成任务的方法。

    3.服务器两种并发模式

    1.半同步/半异步模式

    • 半同步/半异步模式和I/O同步/,异步是两个概念,I/O模型中,“同步”和“异步”区分的是内核向应用程序通知的是何种I/O事件(就绪时间还是完成事件),以及该由谁来完成I/O读写(是应用程序还是内核)。
    • 并发模式中,“同步”指的是程序完全按照代码序列的顺序执行;“异步”指的是程序的执行需要由系统事件来驱动。常见的系统事件有:中断,信号等。


    • 半同步/半异步模式中:同步线程处理客户逻辑,相当于逻辑单元;异步线程用于处理I/O事件,相当于I/O处理单元。异步线程监听到客户请求后,就将其封装成对象并插入请求队列中,请求队列通知某个工作在同步模式的工作线程来读取并处理该请求对象。请求队列的设计主要有:轮流选取工作线程的Round Robin算法,通过条件变量或信号量随机选择一个工作线程。



    2.领导者/追随者模式

    • 该模式是多个工作线程轮流获得事件源的集合,轮流监听,分发并处理事件的一种模式。
    • 在任意时间点,程序有且仅有一个领导者线程,它负责监听I/O事件,而且他线程则都是追随者,他们休眠在线程池中等待成为新的领导者。
    • 当前领导者检测到I/O事件,首先要从线程池中推选出新的领导者线程,处理I/O事件,此时,新的领导者等待新的I/O事件,而原来的领导者则处理I/O事件,二者实现了并发。
    • 领导者/追随者模式包含如下几个组件:句柄集(HandleSet),线程集(ThreadSet),事件处理器(EventHandler),具体的事件处理器(ConcreteEventHandler)。


    • 句柄集(HandleSet)
      用于表示I/O资源,在Linux下通常就是一个文件描述符。句柄集管理众多句柄,它使用wait_for_event方法监听这些句柄上的I/O事件,并将其中的就绪事件通知给领导者线程。领导者则调用绑定到Handle上的事件处理器来处理事件。领导者将Handle和事件处理器绑定是同通过调用句柄集中的register_handle方法是实现的。
    • 线程集(ThreadSet)
      这个组件是所有工作线程(包括领导者线程和追随者线程)的管理者。负责各线程之间的同步以及新的领导者线程的推选。线程集中的线程在任意时间必处于三种状态之一:
       1.Leader:线程当前处于领导者身份,负责等待监听句柄集上的I/O事件。
       2.Processing:线程正在处理事件,领导者检测到I/O事件之后,可以转移到Processing状态来处理该事件,并调用promote_new_leader方法推选新的领导者;也可以指定其他追随者来处理时间(Event Handoff),此时领导者的地位不变;当处于Processing状态的线程处理完事件之后,如果当前线程没有领导者,则它将成为新的领导者,否则它将直接转变为追随者。
      3.Follower:线程当前处于追随者身份,通过调用join方法等待成为新的领导者,也可能被当前领导者指定来处理新的任务。
      需要注意:领导者线程推选新的领导者和追随者等待成为新的领导者这两个操作都将修改线程集,因此,线程集提供一个成员Synchronizer来同步这两个操作,避免竞态条件。


    • 事件处理器和具体事件处理器
      1.事件处理器通常包含一个或多个回调函数handle_event。这些回调函数用于处理事件对应的业务逻辑。事件处理器在使用前需要绑定到某个句柄上,当该句柄上有事件发生时,领导者就执行与之绑定的事件处理器中的回调函数。
      2.具体的事件处理器:是事件处理器的派生类。它们必须重新实现基类的handle_event方法,以处理特定的任务。


    • 由于领导者线程自己监听I/O事件并处理客户请求,因而领导者/追随者模式不需要在线程之间传递任何额外的数据,也无需像半同步/半反应堆模式那样在线程之间同步对应请求队列的访问。但是领导者/追随者的明显缺点:仅支持一个事件源集合,因此无法让让每个线程独立地管理多个客户连接。
















    展开全文
  • Reactor模式,两种高效并发模式

    千次阅读 2016-09-20 21:10:55
    Reactor释义"反应堆",是一种事件驱动机制,和普通函数调用的不同之处在于,Reactor逆置了事件处理... Reactor简单的描述,就是当一件事情到时间了,那么他会自动执行。 Reactor模式的优点: (1)响应快,不必为单
  • 并发模式始终都受制于“不稳定的”、“难模拟的”、“难预测的”接口 RT ,通过并发模式拿到指导运维进行容量规划的结果,是要付出的代价会非常大的,甚至也不能达到想要的结果。 在真实情况下,接口1、接口2、...
  • 先解释一下同步和异步的区别,在并发模式中,这里的“同步"指的是程序完全按照代码的顺序执行,“异步”指的是程序的执行需要由系统事件来驱动,比如说信号、中断等。下图就清楚的解释了同步和异步操作的过程: ...
  • Java知识体系最强总结(2021版)

    万次阅读 多人点赞 2019-12-18 10:09:56
    存储过程与函数 视图 MySQL优化 事务 数据备份与还原 Redis Java虚拟机 深入理解Java虚拟机 架构设计 设计模式 创建型模式 结构型模式 行为型模式 J2EE模式 实践应用 应用框架 Spring 《Spring实战》读书笔记 Spring...
  • 深入理解Java虚拟机-高效并发

    万次阅读 2020-01-04 18:22:38
    并发处理的广泛应用是使得Amdahl定律代替摩尔定律成为计算机性能发展源动力的根本原因,也是人类“压榨”计算机运算能力的最有力武器。 文章目录Java内存模型与线程概述硬件的效率与一致性Java内存模型主内存与工作...
  • 并发模式是指I/O处理单元和多个逻辑单元之间协调完成任务的方法1、半同步/半异步模式1.1半同步/半异步模式【1】同步:程序完全按照代码顺序执行;异步:程序的执行需要由系统事件来驱动。常见的系统事件包括中断,...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。 先看下java中的编译器和解释器: Java中引入了虚拟机的概念,即在机器和编译程序...
  • 一、什么是设计模式1.在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到...
  • 为满足现代工业自动化控制系统中的多串口并发通信需求,提出了基于完成端口机制在VC 开发平台上实现的高效解决方案。阐述了该方案的基本原理、实现流程,以及运行过程中常见问题的解决措施。该方案采用单件设计模式...
  • 并发下线程安全的单例模式(最全最经典)

    万次阅读 多人点赞 2016-05-11 00:32:23
    在所有的设计模式中,单例模式是我们在项目开发中...高并发下如何保证单例模式的线程安全性呢?如何保证序列化后的单例对象在反序列化后任然是单例的呢?这些问题在看了本文之后都会一一的告诉你答案,赶快来阅读吧!
  • 面向模式的软件体系结构(卷2)-用于并发和网络化对象模式: 本书主要关于如何开发高性能网络架构,如何你在编写网络程序,却只知道使用select可以等待多个套接字的话,又或者不知道如何编写高效,可扩展的IOCP,那么...
  • MyBatis面试题(2020最新版)

    万次阅读 多人点赞 2019-09-24 16:40:33
    总结 MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架, Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。 MyBatis的解析和运行原理 MyBatis编程步骤是什么样的? 1、 ...
  • 并发Java 七 并发设计模式

    千次阅读 2017-04-28 15:50:52
    1. 什么是设计模式在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题 ,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领 域引入到...
  • Java并发编程实战

    2019-05-22 11:48:01
    5.6 构建高效且可伸缩的结果缓存 第二部分 结构化并发应用程序 第6章 任务执行 6.1 在线程中执行任务 6.1.1 串行地执行任务 6.1.2 显式地为任务创建线程 6.1.3 无限制创建线程的不足 6.2 Executor框架 6.2.1...
  • 经常会遇到一类需求,在一段字符串中查找所有能匹配上的模式,比如查找一段文字匹配上字典中哪些短语。这时为了高效处理,就会考虑 AC 自动机,即 Aho-Corasick 自动机算法。它的核心思想是通过有限自动机巧妙地将...
  • │ 高并发编程第二阶段03讲、介绍三种高效优雅的Singleton实现方式.wmv │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好...
  • UDP实现高并发其实非常简单

    千次阅读 2021-04-03 11:15:17
    UDP越来越被重视了,人们期望它和TCP一样,但是呢?...UDP能不能像TCP那样做高并发? 内核早在3.9版本就支持REUSEPORT了,但直到2015年底,我也只能做个表面上(看起来像那么回事,但实际上就是垃圾的东西)的东西: ...
  • RocketMQ

    万次阅读 多人点赞 2019-07-31 19:17:34
    RocketMQ并不遵循包括JMS规范在内的任何规范,但是参考了各种规范不同类产品的设计思想,自己有一套自定义的机制,简单来说就是使用订阅主题的方式去发送和接收任务,但是支持集群和广播两种消息模式。开源项目地址...
  • Java知识体系最强总结(2020版)

    千次阅读 多人点赞 2020-03-07 08:35:51
    本人从事Java开发已多年,平时有记录问题解决方案和总结知识点的习惯,整理了一些有关Java的知识体系,这不是最终版,会不定期的更新。...整理的Java知识体系主要包括基础知识,工具,并发编程,数据...
  • 与直接创建线程不同,这些方法让开发者只需要关注要执行的任务,然后让系统执行它们即可,不需要关心线程管理的问题,为开发者提供了一个简单而高效并发任务编程模式。其中一种实现任务异步执行的技术
  • 分工(如何高效地拆解任务并分配给线程)Fork/Join 框架 同步(指的是线程之间如何协作)CountDownLatch 互斥(保证同一时刻只允许一个线程访问共享资源)可重入锁 如何学习 跳出来,看全景,站在模型角度看问题...
  • 多线程与高并发笔记

    千次阅读 多人点赞 2020-09-13 10:14:52
    HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁,假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,...
  • │ 高并发编程第二阶段03讲、介绍三种高效优雅的Singleton实现方式.wmv │ 高并发编程第二阶段04讲、多线程的休息室WaitSet详细介绍与知识点总结.mp4 │ 高并发编程第二阶段05讲、一个解释volatile关键字作用最好...
  • 打造高效代码结构(java性能优化) 新版本通俗易懂_观察者模式递进时讲解 ibatis连接数据库 高并发之单(多)生产者消费者线程 高并发复用数据库链接技术详解之数据库连接池 类加载器的高级特性(自定义类加器实现加密...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 127,923
精华内容 51,169
关键字:

高效并发模式