多线程:多线程设计模式(一):总体介绍

多线程设计模式(一):总体介绍

多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future、Master-Worker、Guard Susperionsion、不变、生产者-消费者 模式;jdk除了定义了若干并发的数据结构,也内置了多线程框架和各种线程池;    锁(分为内部锁、重入锁、读写锁)、ThreadLocal、信号量等在并发控制中发挥着巨大的作用。

多线程设计模式:
1.Single Threaded Execution Pattern
   [同一时刻只允许一个线程操作]

比喻:三个挑水的和尚,只能同一时间一个人过桥,不然都掉河里喂鱼了。
总结:在多个线程同时要访问的方法上加上synchronized关键字。

2.Immutable Pattern
   [变量赋值一次后只能读取,不能改变。]
   比喻:一夫多妻制,多个妻子共享一个丈夫。一旦赋值,任何一个妻子不能更改共享的 husband为其它人。
   总结:将多线程共享的变量用final关键字修饰。

3.Guarded Suspension Pattern
   [要等到我准备好哦,没准备好就在门口等着,准备好了再叫你。]
   比喻:

GG:小伙子去MM家,敲门...
        MM:我在换衣服,稍等。
        GG:等待 【调用wait()方法挂起自己的线程】
        MM:换好了,进来吧 【调用notify()或着notifyAll()方法通知GG】
   总结:判断某个条件是否为真,如果条件成立则继续执行一步,如果条件不成立用wait()方法挂起当前线程,条件为真后由另一个线程用notify()或 着notifyAll()方法唤醒挂起的线程。

4.Balking Pattern
   [有人在做了?哈哈,太好了,我就不过去了!]

   比喻:饭店里我想好了要点的菜后,高高的举起手示意服务生过来,一个服务生准备过去的时候看到另外一个服务生已经过去了,哈哈已经有人过去了我就不过去了。
   总结:设置一个volatile的共享变量,多个线程进入同一方法时,判断变量的值是否为真,如果为真说明有人已经在做这个工作了,线程返回,反之将变量赋值为真并执行。
   
5.Producer-Consumer Pattern
   [生产-消费者,你生产蛋榚我来吃。]

   比喻(1):一群猪围着猪食槽的一头,塞进几块玉米饼后,群猪争先恐后从食槽头抢,谁抢到谁吃。
   比喻(2):一群猪围着猪食槽的头和尾,塞进几块玉米饼后,群猪争先恐后从食槽头和食槽尾抢,谁抢到谁吃。
   总结:<1>生产者将生产出来的东西add(E e)到一个Queue,然后唤醒正在从Queue等东西的线程,用poll()方法从队列的头获取到东西,当Queue里的东西被取完,取东西的线程再次被挂起。
           <2>生产者将生产出来的东西放入(方法很多,有add(E e)、addFirst(E e)、addLast(E e)等)一个Deque,然后唤醒正在从Queue等东西的线程,线程从Deque的头和尾取东西,当Deque里的东西被取完,取东西的线程再次被挂起。

6.Read-Write Lock Pattern
   [学生抄的时候,不允许老师擦掉黑板上的字。]
   比喻:老师在黑板上写了些字,下面的同学在拼命的抄,过会儿老师要写些新的字,写新字要擦掉原来的那些,问:都写完了么?如果都回答写完了,就擦掉原来的字写新的,如果还有一个回答没写完,就等待最后一个同学抄完再写。
   总结:Jdk1.5及以上有专门的读写锁实现
        java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
       java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
7.Thread-Per-Message Pattern  
   [一任务一线程]

   总结:一个客人一个妞服务,好是好,可是天朝扫黄太厉害,现在狼多肉少哇,用线程池吧,轮流服务。

8.Worker Thread Pattern
   [同Producer-Consumer Pattern]

9.Future Pattern
   [给您一张提货单,下午来取。]

   比喻:
       李刚:大钞票一摔,来只大蛋榚!
       店员:对不起没这么大的,但现做,给您张单子,下午xx点来取。
       李刚:取货单??,上面都写了些啥?
            订单号:SB01
             客户名:李刚
             已付款:250
          取货时间:PM2:50
   
   总结:调用某个方法时,这个方法可能需要请求其它系统,这个过程比较耗时,为了提高客户的体验需要方法立即返回,过一段时间再查询结果。
          在程序里声明一个Hashmap,Key保存订单号,Value保存生产出的蛋榚,然后根据订单号取得对应的蛋榚。

10.Two-Phase Termination Pattern
   [玩具收拾好,睡觉去]
   比喻:小孩子在玩具,到点了妈妈喊:别玩了,睡觉去!
   总结:一个线程在while(!isInterrupted()){..}循环中执行,另外一个线程判断某个条件达到后获得准备被结束线程的句柄,调用interrupt()
        设置线程的中断状态。
11.Thread-Specific Storage Pattern
   [线程私有物品保管箱]
    总结:一个方法可能会被同一个线程访问多次,如果每访问一次就要声明一个数据库连接的Connection变量,则对程序的性能有影响。将Connection放在ThreadLocal里,这样每次访问就不必再产生一个Connection,同一个线程对应同一个Connection.

转自:http://sunnylocus.iteye.com/blog/805855

时间: 2024-10-10 03:07:02

多线程:多线程设计模式(一):总体介绍的相关文章

联想高级Java研发面经+面试题:Spring+多线程+MySQL+设计模式

上个礼拜,之前的一个同事突然联系我说他去面了联想的JAVA开发工程师,想分享一下面试经历和面试题.我当时就拍板说,好啊! 然后就整理了一下,写了这篇文章:和大家分享一下这次面试经验和面试题. 薪资还可以啊,年薪40W+啊!多少人的梦想啊! 言归正传,和大家分享一下这次联想的面经和面试题: 联想面经: 第一轮:电话初面 第二轮:技术面谈 第三轮:高管复试 第四轮:HR最后确认 No.1:第一轮面试--电话初面 首先确认对联想的意向度(如果异地更会考虑对工作地点(北京)的意向度!联想很看重这个):其

多进程和多线程的架构的简单介绍

多进程和多线程的架构的简单介绍 多线程的意义为帮助你决定开发软件时采用多进程架构还是多线程架构.不了解这种区别会在大型软件的设计开发过程中造成困扰. Oracle的Unix/Linux版本采用多进程架构,不同的功能模块由不同的进程负责,Windows版本采用单进程多线程架构,所有的模块所在线程处在同一个进程当中.我们来看一下区别:1.进程管理.Oracle某个模块挂起了,没有响应,万般无奈你要重起这个模块,Unix平台只要重起这个模块所在的那个进程就可以了,其它进程保持运行,而Windows平台

多线程快速解压FastZipArchive介绍

本文转载至  http://blog.csdn.net/xunyn/article/details/12975937 多线程解压iosfast 在iOS项目中用到解压缩,用的是ZipArchive,下载点击这里,ZipArchive是基于minizip的,但不支持多线程,封装的也不方便,然后就有了FastZipArchive,现在有一个粗糙的版本,下载点击: 一  FastZipArchive的简介如下: 1 基于ZipArchive和minizip的解压框架 2 支持多线程并发 3 拥有更快的

设计模式回顾系列之总体介绍

设计模式回顾系列之总体介绍 1. 背景与介绍 设计模式是经过反复使用.经过分类的代码总结.设计模式的目的是提高代码可重用性和可靠性,并使代码条理清晰.易于理解.易于维护. 设计模式描述了在各种情况下,要选择什么样的方案来解决问题.设计模式通常以类和对象来描述其中的关系和相互作用,换句话就是在设计模式里,这些类和普通的类没有区别,只是它们的相互作用形成了各种设计模式,并解决了很多现实性的问题. 设计模式能使不稳定依赖于相对稳定.具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变

IOS开发多线程-多线程技术1

一.基本概念 1.什么是进程 进程就是指在系统中正在运行的一个应用程序 每个应用之间是相互独立的 每个进程都运行在其专有的并且受保护的内存空间内. 2.什么是线程 一个进程想要执行程序,就必须需要一个线程, 线程是程序执行的基本单元,应用的所有的任务都在线程中执行的. 当程序启动之后,系统会自动为进程创建一条线程,称之为 “主线程”  “UI线程” 3.线程的串行 一个线程执行任务是串行的,也就是说,在一个线程内,执行任务是从顺序执行的 同一时间,线程只能执行一个任务----> CPU在同一时间

飞达资讯App总体介绍及关系架构图

飞达资讯App总体介绍: 下图为飞达资讯App的关系架构图: 该App关系架构图所需的图片云盘链接地址:http://pan.baidu.com/s/1gfHIe4b 提取密码:x1nr 该App的云盘下载地址:http://pan.baidu.com/s/1eS8WGXs 提取密码:5eqe 由于作者水平有限和时间仓促,该App可能存在一些疏漏和不当之处,敬请读者批评指正. 作者联系方式: 电话:15223328653,QQ:2099904576,邮箱:[email protected]

ABP总体介绍

ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板. ASP.NET Boilerplate 基于DDD的经典分层架构思想,实现了众多DDD的概念(但没有实现所有DDD的概念). ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上

JS总体介绍

一. 总体介绍 结合近半年来前端的项目的经验,这里梳理一下JS常用知识,方便自己日后温习查找,同时给广大JS入门者提供一些帮助,文章中如有错误,欢迎指出. 这里从JS常用事件.Dom方法.数组.Dom操作.offset专题.event家族.Scroll家族.动画.闭包.面向对象基础等方面着重介绍一套JS相对完善的前端JS体系.

Java基础-多线程-③多线程的同步之synchronized

使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程也对数据进行了操作,从而导致数据出错.由此我们想到一个解决的思路:将操作共享数据的代码行作为一个整体,同一时间只允许一个线程执行,执行过程中其他线程不能参与执行.线程同步就是用来实现这样的机制. synchronized代码块 Java中提供了synchronized关键字,将可能引发安全问题的代码