我的多线程—多线程与设计模式阅读笔记
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类实现回调
。。。未完待续
以上是关于我的多线程—多线程与设计模式阅读笔记的主要内容,如果未能解决你的问题,请参考以下文章