设计模式和多线程基础知识图谱
2023-01-17 19:07:35 4 举报
多线程
作者其他创作
大纲/内容
ps:无锁,高并发,使用环形buffer,直接覆盖(不用清除)旧数据,降低GC是一个基于事件的生产者和消费者模式,观察者模式
readwritelock
forkJionPool的线程池执行方法,需要执行forkJoinTask的任务,在任务中调用compute中进行任务拆分,并进行最终的任务合并。
RecursiveTask:有返回值的任务
二十三种设计模式------创建者模式
synchronized
将抽象和实现部分分离,使他们都可以独立变化。吧类的继承转变成动态的组合关系。把多个个类进行抽象 组合。而不是固定的写死 pay抽象类:微信 支付宝 payMode抽象类:刷脸 指纹 密码
缓存行
font color=\"#111112\
对象定位
查询是否打断 ,并重置标志位
适配器模式
threadLocal
基于不同的条件完成不同的需求。定义个策略抽象类, 不同的策略实现不同的逻辑,而后使用 多态
6种设计原则
等待io有用
state:volatile修饰的值 不同的实现有不用的用,Reettrantlock中用来表示重入的数一个线程链表:用来存放锁住的线程cas:通过cas来设置当前线程独占锁
原型
jmh(测试)
由于一些原因不能去直接访问对象。通过代理来访问。静态代理:通过吧目标类组合传入,形成单向关联关系动态代理:通过接口来实现代理invoketionhandler.invoke实现CGLIB代理:不能对声明final的类代理,生成被代理类的子类,是通过字节码生成技术代理。
强软弱虚
1:线程池数量加12:加锁来进行任务加1 并且启动线程
环形队列上满了后的等待策略
1:markword 2:classpointer3:成员变量4:数组长度(数组独有)5:对其填充
状态模式
主要是需要重写compute方法,用来进行任务的分割
submit
外观模式(门面模式)
cup三级缓存
信号量:通过acquire 获取,获取到就执行。限流
execute方法
Ring Buffer
AQS
抽象工厂
观察者模式
static interrupted()
栅栏:等待线程满了再执行
工厂方法
CyclicBarrier
强:程序结束或者没有引用指向会释放软:堆空间满了弱:gc就会回收虚:回收虚引用时会给一个关联的队列中吧这个虚引用对象存放进去
查询是否打断
公平:线程来进来的时候直接进入线程等待队列非公平:线程进来时先抢一下cpu的运行权再进去队列,抢到直接运行
为子系统中的一组接口提供统一的接口,是子系统更易于使用
Hotspot调用了lock 指令
封装了创建了对象的过程,吧对象创建和业务逻辑分开,如果扩展需要修改工厂类
ThreadPoolExecutor线程池
事件处理接口
单核CPU线程切换的意义?
forkJoinPool线程池 (适合任务切小任务.cpu密集型)
把工厂抽象,扩展时需要创建工厂类和产品类,没有违背开闭原则,每增加一个产品需要增加对应工厂,后期会越来越复杂。1对1
启动多少线程执行
aba问题:加version号Hotspot实现:加了lock 的cmpxchg(单核不用加lock)
组合模式
工厂模式
Sequencer
disruptot(内存里面的高效的的用于存放元素的数组队列)
cpu获取数据:1:先去寄存器中获取(核内 <1ns)2:去1级缓存获取(核内 1ns)3:去二级缓存获取(核内 3ns)4:去三级缓存获取(cpu内 15ns)5:去主内存其获取(cpu外 80ns)
@Measurement
1:句柄池 ,对象指向的东西有一个指向堆中数据,一个指向class对象2:直接指针 指向堆中对象,堆中对象报错class对象地址
公平锁和非公平
CAS
对象在内存中的存储布局?
允许允许是讲一个或多个操作用于一个组对象(重载)操作和对象结构分离。主要解决数据和算法的耦合问题,在数据结构稳定算法多变的情况下,为了不污染数据,在访问数据时根据数据类型自动切换对应的算法。
set():会给当前线程设置进去值。key-->当前线程value-->设置进去的值threadLocal中的当前线程的map 中的每个entny都是一个弱引用。当threadlocal用完后remove()可以防止内存泄漏。因为会吧当前的key给删除掉,而map的引用为null后gc能够回收。
创建线程的5中方式?(最底层是创建一个thread 调用start())
@Fork
1:判断核心线程数是否够,不够通过addWorker创建线程2:判断线程是否运行,添加到队列里3:创建非核心线程数
代理模式
提供一个对容器对象中的各个元素进行访问的方式,而又不需要暴露该对象的内部细节。
interrupt(不是打断是设置打断标志位)
RecursiveAction:没有返回值的任务
迭代器模式(游标模式)
责任链模式
countDownLatch
forkJoinTask
buider抽象接口:声明了所有子类创建对象的具体步骤buider子类:通过对于步骤中存入不同属性产生不同对象。指挥者:通过子类来调用构建的方法来创建对象产品:最终的产品。
定义对象一对多依赖关系,当一个对象改变时,他得所有依赖项都得得到通知和更新。观察者:被观察者发生改变,观察者得到通知后做出相应的改变被观察者:发生行为or事件驱动
读不加锁,写加锁 调用不同的方法获取不同的锁,读不加锁可能读到中间的数据
@beachmark
对方法调用多少次取平均
动态的给对象添加一些额外的功能,比子类更加灵活继承或者实现共同的接口,并吧被装饰类当成变成成员变量,再在当前方法中进行公共增强
抛弃每个对象保存数据的方式,多个对象共享数据 节省空间。
二十三种设计模式------行为型模式
线程
构建者
备忘录模式
基础注解,用于标注。
interrupt()
环形队列上的指针指向当前消费的事件
会抛出interrupt异常,并且重置标志位
EventHandler
允许一个对象在内部改变时改变他的行为。
1)继承Thread类创建线程;2)实现Runnable接口创建线程;3)实现Callable接口,通过FutureTask包装器来创建Thread线程;4)使用ExecutorService、Callable(或者Runnable)、Future实现由返回结果的线程。5)使用CompletableFuture类创建异步线程,且是据有返回结果的线程。 JDK8新支持的
简单工厂
消费者
1:继承AQS,实现runnable 2:其中有个thread来表示是那个线程执行。
volatile(可见性,禁止指令重排,不保证原子性)
门栓:等待设置数量的线程执行完再执行
设置标志位
线程数=cpu核数*cpu的利用率*(1+等待时间/计算时间)
Producer
cpu防止指令重排序
在定义了整体流程,将一些步骤推迟到子类中实现,
二十三种设计模式------结构型模式
1:栈上分配(逃逸分析)2:线程本地3:eden4:old(大对象)
模板方法模式
worker类
@Warmup
提交任务有返回值
将类的接口转换成客户期望的另一个接口,让不兼容的类协同工作。类适配器:实现目标接口 ,继承adaptee类,对象适配器::实现目标接口 ,把adaptee类变成adapter类成员变量,组合关系 推荐
内存屏障:load和store1:loadload2:storestore3:loadstore4:storeload
对象分配规则
semaphore
怎么设置设置线程的数量?
Wait Strategy
工厂抽象且一个具体工厂生产一组相关的产品 1对多
1:锁信息 2位+偏向锁1位2:hashCode3:分代信息4:threadId
策略模式
interrupted()
将对象组合成树形结构,使对待单个对象和多个对象处理一致(文件和文件夹:统一的逻辑处理,递归遍历)
@BeachmarkMode
线程在lock锁时时interrupt 标志位改变?
不破坏封装的前提下,获得对象内部状态并保存,这样可以将对象恢复到原先历史的状态。dome:事务的撤销和回滚
处理请求者依次排列,组成一条链。处理接口中保存一个下一个处理对象的成员变量。
1:饿汉式:类加载直接创建。线程安全。但是会浪费一定内存2:懒汉式:在需要的时候创建。线程不安全 2.1:改进懒汉DCL:双检锁 线程安全3:静态类部内 线程安全4:枚举 线程安全 反射也没办法破坏
1:无锁 没有请求的时候2:偏向锁 当有第一个请求访问时3:轻量级锁 当有几个线程进行争抢时4:重量级锁 当自选超过一定限度的时候进入内核态进入线程等待队列 waitQueue
用一个已经有的实例作为模板来复刻,clone();
用什么模式-->吞吐量
线程不会抛异常,正常运行
addworker
单例
桥接模式
线程在synchronized时interrupt 标志位改变?
cpu从主内存中读取数据是一行一行读64个字节
装饰器模式
核心:环形队列,初始化环形队列的时候会同时初始化队列上的事件
volatile防止指令重排序
享元模式
访问者模式
markword
收藏
0 条评论
下一页
为你推荐
查看更多