首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

懂得多线程设计模式

2013-04-20 
理解多线程设计模式??? 比喻:三个挑水的和尚,只能同一时间一个人过桥,不然都掉河里喂鱼了。?? 总结:在多个

理解多线程设计模式

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

?


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


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

????????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[懂得多线程设计模式]?活动对象

热点排行