当前位置: 首页 > 编程日记 > 正文

理解多线程设计模式

多线程设计模式:
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.


12.Active Object[]

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

相关文章:

Linux内核之旅

内核模块是Linux内核向外部提供的一个插口&#xff0c;其全称为动态可加载内核模块&#xff08;Loadable Kernel Module&#xff0c;LKM&#xff09;&#xff0c;我们简称为模块。Linux内核之所以提供模块机制&#xff0c;是因为它本身是一个单内核&#xff08;monolithic kern…

qq腾讯第三方登陆

html页面&#xff1a;<html> <head> <meta charset"utf-8" /> <title>第三方登录</title> <meta property"qc:admins" content"1541324001721762700063671645060454" /> </h…

如何利用 Python 爬取 LOL 高清精美壁纸?

作者 | 阿拉斯加 来源 | 杰哥的IT之旅 一、背景介绍 随着移动端的普及出现了很多的移动 APP&#xff0c;应用软件也随之流行起来。最近看到英雄联盟的手游上线了&#xff0c;感觉还行&#xff0c;PC 端英雄联盟可谓是爆火的游戏&#xff0c;不知道移动端的英雄联盟前途如何&…

生产环境主从数据同步不了?

生产环境主从数据同步不了&#xff1f;经历过程&#xff1a; 一般我们常常在做主从复制的时候&#xff0c;可能是很少遇到到错误&#xff0c;那都是因为&#xff0c;你做主从基本用的是&#xff0c;本地虚拟机做&#xff0c;或者一些测试环境做。但是当我们把主从复制部署…

用 YOLOv5模型识别出表情!

作者 | 闫永强来源 | Datawhale本文利用YOLOV5对手势进行训练识别&#xff0c;并识别显示出对应的emoji&#xff0c;如同下图&#xff1a;本文整体思路如下。提示&#xff1a;本文含完整实践代码&#xff0c;代码较长&#xff0c;建议先看文字部分的实践思路&#xff0c;代码先…

Linux操作系统中内存buffer和cache的区别

我们一开始&#xff0c;先从Free命令说起。 free 命令相对于top 提供了更简洁的查看系统内存使用情况&#xff1a; $ freetotal used free shared buffers cachedMem: 255268 238332 16936 0 85540 126384-/ buffers/cache: 26408 228860Swap: 265000 …

sort cut 命令的常用用法

sort命令介绍&#xff1a;sort是在Linux里非常常用的一个命令&#xff0c;管排序的&#xff0c;集中精力&#xff0c;五分钟搞定sort&#xff0c;现在开始&#xff01;1 sort的工作原理sort将文件的每一行作为一个单位&#xff0c;相互比较&#xff0c;比较原则是从首字符向后&…

使用 dockerfile 创建镜像

dockerfile 是一个文本格式的配置文件&#xff0c;可以使用 dockerfile 快速创建自定义的镜像。 dockerfile 一般包含4部分信息&#xff1a;基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令 创建镜像命令&#xff1a;docker build [选项] 路径&#xff0c;会读取指…

wireshark的使用教程--用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的

wireshark的使用教程 --用实践的方式帮助我们理解TCP/IP中的各个协议是如何工作的 wireshark是一款抓包软件&#xff0c;比较易用&#xff0c;在平常可以利用它抓包&#xff0c;分析协议或者监控网络&#xff0c;是一个比较好的工具&#xff0c;因为最近在研究这个&#xff0c;…

设计师你们还坐的住吗?2021 PS 进入人工智能 P 图时代

与每年一样&#xff0c;Adobe 的 Max 2021 活动顺利开展。本次活动主要是以产品展示以及其他创新产品。 这个活动最有趣的特点之一是&#xff0c;Adobe 不断将人工智能集成到其产品或是功能中。在过去的几年里&#xff0c;人工智能一直是这家公司不断探索的领域。 与许多其他公…

图像处理之噪声---椒盐,白噪声,高斯噪声三种不同噪声的区别

白噪声是指功率谱密度在整个频域内均匀分布的噪声。 所有频率具有相同能量的随机噪声称为白噪声。白噪声或白杂讯&#xff0c;是一种功率频谱密度为常数的随机信号或随机过程。换句话说&#xff0c;此信号在各个频段上的功率是一样的&#xff0c;由于白光是由各种频率&#xff…

发现一个“佛系记账本”

因为这是一款微信小程序&#xff0c;张小龙大力推崇的“用完即走”完美地适合记账应用。 不用下载、不用安装、不用注册、不用各种授权&#xff0c;只要从微信进入&#xff0c;就能记账&#xff0c;账本只与微信关联。 换手机、换PAD都无所谓&#xff0c;只要登录微信&#xff…

YSLOW法则中,为什么yahoo推荐用GET代替POST?

原文&#xff1a;http://www.cnxct.com/use-get-for-ajax-requests-why/ 背景&#xff1a;上上周五&#xff0c;公司前端工程师培训&#xff0c;提到前端优化的一些技巧&#xff0c;当然不能少了yahoo yslow的优化法则。其中有这么一条“Use GET for AJAX Requests”&#xff0…

Python 多进程、协程异步抓取英雄联盟皮肤并保存在本地

作者 | 俊欣来源 | 关于数据分析与可视化就在11月7日晚间&#xff0c;《英雄联盟》S11赛季全球总决赛决斗&#xff0c;在冰岛拉开“帷幕”&#xff0c;同时面向全球直播。在经过了5个小时的鏖战&#xff0c;EDG战队最终以3:2战胜来自韩国LCK赛区的DK战队&#xff0c;获得俱乐部…

QT 5.4.1 for Android Ubuntu QtWebView Demo

QT 5.4.1 for Android Ubuntu QtWebView Demo 2015-5-15 目录 一、说明&#xff1a; 二、参考文章&#xff1a; 三、QtWebView Demo在哪里&#xff1f; 四、Qt Creator 3.4.0能打开QtWebView Demo&#xff1f; 五、Qt Creator如何生成AndroidManifest.xml&#xff1f; 一、…

硬改TP-Link WR841N v8刷breed和OpenWrt

找到了以前的路由器&#xff0c;想刷OpenWrt但版本是TP-Link的WR841N v8版&#xff0c;上网查过才知道&#xff0c;是专门面向国内发布的严重缩水版国际版的Flash是4M&#xff0c;内存RAM是32M&#xff0c;国内版是2M/16M&#xff0c;不过论坛上也有人说到手的Flash是4M的。(Op…

Facebook的实时Hadoop系统

原文地址&#xff1a; http://blog.solrex.org/articles/facebook-realtime-hadoop-system.html作者&#xff1a;杨文博Facebook 在今年六月 SIGMOD 2011 上发表了一篇名为“Apache Hadoop Goes Realtime at Facebook”的会议论文 (pdf)&#xff0c;介绍了 Facebook 为了打造一…

Ka的回溯编程练习 Part1|整划什么的。。

1 #include<stdio.h>2 int search(int s,int t);3 void op(int k);4 int res[1001]{1},n;5 int main()6 {7 //scanf("%d",&n);8 n10;9 search(n,1); 10 return 0; 11 } 12 int search(int s,int t) //当前数的大小s&#xff0c;个数n 13 …

开发者关心的十个数据库技术问题

作者 | 雷海林 责编 | 田玮靖出品 | 《新程序员》如今&#xff0c;数据库越来越受到业界的广泛关注&#xff0c;许多高校毕业生及资深技术人也逐渐投身于数据库产业。《新程序员002》经过用户、专家调研&#xff0c;收集汇总了十个开发者关心的数据库技术问题&#xff0c…

使用T-SQL语句操作数据表-更新数据

使用update语句更新表中的数据。也就是修改表中的数据。update语法格式&#xff1a;update <表名> set <列名更新值> [where <更新条件>] 解释&#xff1a;update 是更新数据名&#xff0c; 表明是更新数据set 是必要的&#xff0c; 后面可以紧随多个数据列的…

Category Archives: Linux

原文地址&#xff1a;http://blog.solrex.org/articles/solrex-linux-cheatsheet.html Cheatsheet&#xff1a;原意是考试的时候带的小抄&#xff0c;所以说是 cheat&#xff08;作弊&#xff09; sheet。在计算机科学领域里&#xff0c;主要是指记录一些难记命令或者操作的快查…

利用 OpenCV+ConvNets 检测几何图形

作者 | 小白 来源 | 小白学视觉 导读 人工智能领域中增长最快的子领域之一是自然语言处理&#xff08;NLP&#xff09;&#xff0c;它处理计算机与人类&#xff08;自然&#xff09;语言之间的交互&#xff0c;特别是如何编程计算机以处理和理解大量自然语言数据。 自然语言处理…

《Linux实践及应用》

2019独角兽企业重金招聘Python工程师标准>>> 《Linux实践及应用》 本书以RedHat 9.0为蓝本&#xff0c;系统地介绍Linux的基础知识、Linux系统的安装与配置、常用命令&#xff0c;以及如何进行Linux系统管理和基本的网络服务设置&#xff08;包括如何设置DNS服务器、…

找不到包含 OwinStartupAttribute 的程序集

2019独角兽企业重金招聘Python工程师标准>>> 尝试加载应用时出现了以下错误。 找不到包含 OwinStartupAttribute 的程序集。找不到包含 Startup 或 [AssemblyName].Startup 类的程序集。 若要禁用 OWIN 启动发现&#xff0c;请在 web.config 中为 appSetting owin:A…

Imagination 推新款GPU IP,首次实现桌面级光线追踪效果

游戏界被炒得最热的概念可能就是光线追踪技术了&#xff0c;不仅仅是PC端的游戏。光线追踪所展示出来的画面效果也确实惊艳&#xff0c;可以让我们感叹到图像技术达到的一个新高度。 但是实际上&#xff0c;光线追踪并不是一个新技术。10年前&#xff0c;光追就是游戏玩家茶余…

percent之集合

2019独角兽企业重金招聘Python工程师标准>>> 这个留到明天再来写吧,今天把hub剩下的坑填掉. 转载于:https://my.oschina.net/u/2011113/blog/416458

Mr. Process的一生-Linux内核的社会视角 (2)启动

原文地址&#xff1a; http://www.manio.org/cn/startup-of-linux-view-of-society.html 其实这才应该是这一系列文章的第一节&#xff0c;因为这篇文章讲的是盘古开天地的事。话说Mr. Process是一个现代人&#xff0c;但是&#xff0c;只要是人&#xff0c;总该有个祖先。人们…

深入研究ConcurrentHashMap 源码从7到8的变迁

ConcurrentHashMap是线程安全且高效的HashMap 1 为什么要使用ConcurrentHashMap 线程不安全的HashMap HashMap是Java中最常用的一个Map类&#xff0c;性能好、速度快&#xff0c;但不能保证线程安全&#xff0c;它可用null作为key/value HashMap的线程不安全主要体现在resize时…

IANA定义的常见服务的端口号列表

最新明细&#xff1a;http://www.iana.org/assignments/port-numbers 几个重要常见端口&#xff1a; 21 FTP 22 SSH 80 HTTP 443 HTTPS 1433 MSSQLserver 3306 MySQL 11211 memcached

oracel 服务详细介绍

中的方法成功安装Oracle 11g后&#xff0c;共有7个服务&#xff0c; 这七个服务的含义分别为&#xff1a; 1. Oracle ORCL VSS Writer Service&#xff1a; Oracle卷映射拷贝写入服务&#xff0c;VSS&#xff08;Volume Shadow Copy Service&#xff09;能够让存储基础设备&…