线程池的设计思想及观察者模式

单例模式之懒汉式

饿汉式在多线程的情况小可能会出现多实例的情况

解决1;加锁

 

解决2:双层判断方式,减少枷锁的次数doubleCheck

 3.保证程序的有序性,禁止程序内部优化,从而保证不会出现空指针异常

 

4.利用jvm只产生一份static,并且是主动加载,实现单例懒汉式

 

 使用枚举模式

 volatile的讲解

 cpu的每个cache都存放一份指令,目的是提高执行效率,但是这样的话,每个线程执行得到的数据如果,线程的数据没有被进行写的操作,是不会到主线程去读取数据,这就会出现缓存数据错误的问题

解决cpu分布式缓存的方案:保证数据一致性

 第二种的效率比较高,

 并发编程需要保证三个条件

1:程序保证原子性

2、可见性(各个线程的数据要保证共享数据的一致)

 3、顺序性(jvm在执行程序的时候,会对程序进行重排序,但是会保证最终一致性。这对于单线程是没有问题的,但是在多线程的时候,有可能会出现空指针异常:比如说一个对象还没有创建,另外一个线程就对他进行了调用)

 比如上面这个程序,一个线程已经创建了对象,但是还没有初始化,下一个线程判断对象已经创建了,就直接调用,就会出现空指针异常

java中如何保证上面三个条件

 

 

 

 

 观察者模式

 观察者模式的主要组成:subect,observer,observerClient,observerd订阅subject,只有subject发生了变化才会通知oberver

使用观察者模式设计查询,观察多线程的运行转态

 在observer中,每个id开启一个线程去查询线程的状态

 

 

 

 

 

 threadcycle类是针对具体的业务,对她进行观察,observerrunable类抽取出了对监听地获取,监听转态的类型,对监听的通知的高度抽象功能,监听器,也相当于一个过滤器,可以将重复的代码都写在监听器中,从而减少工作量

多线程的观察者设计模式总结:

ObserverRunable的功能是是将获取到的变化信息返回出去

observer是具体的业务,

在调用observer的业务方法的时候,通过ObserverRunable的方法,将变化的信息通知出去

原文地址:https://www.cnblogs.com/zj-xu/p/11863527.html