线程池的设计思想及观察者模式
单例模式之懒汉式
饿汉式在多线程的情况小可能会出现多实例的情况
解决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的方法,将变化的信息通知出去