我的多线程—多线程与设计模式阅读笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的多线程—多线程与设计模式阅读笔记相关的知识,希望对你有一定的参考价值。

java多线程与设计模式

1.Producer-Consumer模式  我来做,你来用 命名生产消费者模式.  生产者和消费者只有一个成为Pipe模式

如何解决两者之间处理速度差异的问题?


              data

               |

               |

               |

Producer --> Channel <-- Consumer

如何解决剩余空间的问题?如何解决内存溢出的问题?

传递顺序有哪些?优先队列如何实现?



2.Read-Write Lock模式

读等待写模式。 读写分离,读取的锁和写入的锁分开。

如何实现读写分离?执行互斥处理会降低程序的性能

ReadWriteLock类如何提供读写锁?Before/After模式

ReadWriteLock模式

读方法礼让写方法

物理锁 -----> 逻辑锁



3.Thread-Per-Message模式。 给你我就不管了模式

每个消息一个线程

每个命令或请求分配一个线程

“委托端”和“执行端”是不同的线程

角色:Client(请求发动者)。 Host(请求接收者 线程创建者)。 Helper助手(处理请求者)---->达到异步执行的操作

优点:明显提高程序的响应性,降低时间

handle操作花费的时间 和 线程启动花费的时间

适用场景:适用于操作顺序没有要求时,适用于不需要返回值时


4.Immutable模式 不变模式  安全模式

内部状态不会发生变化,不变的,安全的,只有一个入口,只是为了明确编程人员的意图

1.实例被创建且字段被初始化之后,字段值就不会修改final

2.多个线程同时执行也没有关系 

3.优点不需要synchonized保护



5.Single Threaded Execution模式   独木桥模式

万人抢独木桥模式


----------->

----------->

-----------> ---------> 一次只允许一个人通过(Synchonized)

----------->

----------->


6.Guarded Suspension模式  为了保护而等待模式

while - wait - notify模式

消息队列作为中间人

应该将什么作为施加守护条件(必须要满足的条件)?

为什么使用while?哈哈

线程等待什么?notify?状态改变?

什么是前置条件(守护条件)?

关键角色“:GuardedObject 被保护的对象  保护的方法  状态改变的方法



7.Balking模式  1>不吃不给饭(不执行),吃的话就让你吃一次(状态只改变一次)模式

没有Guarded Suspension那么好的脾气,不等待,不执行 

没有Guarded Suspension那么反复,状态只改变一次

状态只改变一次,通常称为闭锁(毕+索)

优点:已经执行过了或者其他情况不需要再次执行,直接balk

     提高程序的响应性

balk结果的表达方式?忽略 返回值 异常



8.Woker Thread模式。工人模式 线程池模式

委托者将任务交给工厂,工厂将任务分派给工人,工人完成任务模式

1>工人做的任务是一样的  2>每次启动线程浪费时间,提高吞吐量

多余的工人不干活只吃饭也是一个问题?



9.Future模式    填写单子(数据的预处理和封装  不完整的数据)排队(等待)业务完成(完整的数据)

处理业务 和 获取结果 去抢独木桥(分离)


10.Two-Phase Termination模式

如何使用多线程实现计数器,并能随意停止?

该模式角色:中介请求

interrupt立即结束线程




11. Thread - Specific Storage模式。 线程仓库模式,每个线程都有自己单独的仓库。     ----似曾相识的老朋友

认识java.lang.ThreadLocal类 get 和 set方法

人物情节?委托者将任务交给代理proxy,代理从仓库中获取当前现线程执行者执行当前任务

优点:可能不会提高吞吐量,1>不存在显示地执行互斥处理。2>不改变结构即可实现程序 不加synchonized等关键字

缺点:引入上下文隐藏了一些信息,难以找到bug的原因


课外阅读:ThreadLocal仓库的生命周期?

         线程特有信息存储的位置?线程外和线程内(废话啊),线程内和线程外存储信息的区别?想象钱哪里?有啥子区别?

         最低限度互斥处理原则,减少不必要的sharedResource


延伸阅读:Doug Lea提出:基于角色(完成不同任务的线程)、任务(任务抽离,各个线程都可以执行,例如线程池)、角色和任务合并这三种考虑方式




12.Active Object模式。 接受异步消息的主动对象 难懂的模式,武林秘籍的最后一招啦

模式集合体:Future模式getResult

这个模式发生了什么啊???  线程池模式   Future模式   主动对象模式



main 测试程序行为的类


MakerClientThread 组装字符串的线程

DisplayClientThread 显示字符串的线程


ActiveObject接口 组装和展示字符串的


ActiveObjectFactory 创建主动信息的工厂


Servant真正makeString 和 displayString的类。 实现ActiveObject接口


Result结果的接口,获取结果

FutureResult Future模式

RealResult 实际执行的结果


MethodRequest 表示请求的抽象类

DisplayStringRequest类  展示字符串的请求类

MakeStringRequest类 组装字符串的请求类



ActivationQueue类   线程池类


SchedularThread 将请求交给线程池的类





线程扩展阅读:

1>认识InterruptedException:花费时间 可以取消。 interrupt只是改变线程的状态,wait的时候会检测这种状态抛出异常。isInterrupted检查中断状态

sleep和interrupt方法,打断我睡觉,报警啦(抛出异常)!!!

wait和interrupt方法,让我静会,你敢吵我,等我反应过来(获取lock),我会报警啦(抛出异常)!!!

notify和interrupt方法的区别

不要使用Thread的stop方法


2>BlockingQueue接口--阻塞队列

  基于ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、DelayQueue、SynchronousQueue、ConcurrentLinkedQueue(无最大限制)


3>进程内存独立,线程内存共享  进程上下文切换繁琐。 线程上下文切换简单

再次了解ThreadFactory接口

代码完全不需要修改,说明所用的类可复用性很高

Executors.defaultThreadFactory()创建线程工厂


4>Thread。创建启动线程的类

Runnable 线程所执行的“工作”的接口 

ThreadFactory 将线程的创建抽象化了的接口

Executor 接口,将线程执行抽象化了的接口

ExecutorService 将被复用的线程抽象化了的接口

Executors 创建实例的工具类


5>synchonized{}和before-after设计模式?synchonized保护着什么?synchonized以什么单位保护?使用哪个锁保护?

  什么是原子操作?long和double不是原子操作


6>认识Semphore计数信号量 acquire方法 和 release方法


7>集合与多线程:

利用Collections.synchonizedList方法进行同步

使用copy-on-write的 CopyOnWriteArrayList类。 写的时候复制,写的少会很划算


8>Guarded Suspension = 附加条件的synchronized模式 (解释完美)=多线程的if

  生存性面临挑战(加超时时间结局)    

  busy wait忙于等待  yield看电影女友还没来,先让其他排队的人进,一种礼让

  java.util.concurrent.BlockingQueue 阻塞队列的概念


9>balk使用的条件:不需要执行时,不需要等待守护条件成立时,守护条件尽在第一次成立时

  balk结果的表示方式:忽律balk,返回值,异常


10>guarded timed或timeout 超时

   wait(等待的时间)  Allen Holub著作(If I Were King)

   什么时候可以设置等待超时?



11>好玩的实例?如何使用java.util.concurrrent.Exchanger类交换缓冲区 666 这个有点厉害

   传递缓冲区后,作为交换,接受空的缓冲区(重点)



12>java.util.concurrent.locks.ReentrantReadWriteLock 使用before-after模式实现了读写分离


13>理解GUI事件分发


14>ThreadPoolExecutor类 线程池


15>jva.util.concurrent包中的Callable类实现回调



。。。未完待续










以上是关于我的多线程—多线程与设计模式阅读笔记的主要内容,如果未能解决你的问题,请参考以下文章

我的多线程 HttpClient 有啥问题吗?

Java的多线程实现生产/消费模式

JAVA学习第二十五课(多线程)- 单例设计模式涉及的多线程问题

多线程和多进程模式有啥区别

单例模式双重检查(DCL)引发的多线程问题

极智Coding | OpenMP 多线程使用