设计模式的目的:是经验总结,为了可重要代码。
分为三类:创建者模式: 单例 工厂方法 抽象工厂 建造者 原型
结构型模式: 适配器 装饰器 代理 桥接 组合 享元
行为型模式: 策略 模板方法 观察者 迭代子模式 中介者 责任链
一共23种设计模式。
单例模式:这种模式用的比较多,比较常见。
:保证在一个JVM中,该对象只有一个对象实例。存在
好处:有些类频繁创建,开销大。单例模式 省去NEW操作,减少cpuGC压力。 或者 控制系统核心流程,创建多个乱套。
1.饿汉式单例模式:
public class Singleton
{
private static Singleton instance = new Singleton();
public static Singleton getInstance()
{
return instance ;
}
}
}
2.懒汉式单例模式:
public Class DoubleCheckedLocking{
private Volatile static Instance instance;
public static Instance getInstance(){
if(instance==null){
synchronized(DoubleCheckedLocking.class){
if(instance==null)instance=new Instance();//问题出在这里
}
}
}
}
在这里有必要说一下,一般来说是可以的,但是考虑到java并发,重排序的问题。由于instance=new Singleton()其实做了三个操作,1 分配对象的内存空间 2 初始化对象 3 设置instance指向分配的内存地址 2 和 3 重排序了。 所以当其他线程访问时,判断instance为空。错误。最好的方法是: 基于volatile的解决方案
3.单例之基于类初始化的延时加载:
:JVM在类的初始化阶段(Class被加载后)会执行类的初始化,jvm会获取一个锁。可以同步多个线程多同一个类的初始化
public class InstanceFactory{
private static class InstaceHolder{
public static Instance instance =new Instance();
}
public static Instance getInstance(){
return InstaceHolder.instance //InstaceHolder被初始化
}
}
实质是允许重排序,不允许非结构线程(线程B)看到这个重排序