设计模式-单例模式

来源:互联网 发布:java数据脱敏技术 编辑:程序博客网 时间:2024/05/22 02:46

单例模式

单例模式的要点:

      1、将采用单例模式的类的构造方法私有化。      2、在其内部产生该类的实例化对象,并将其封装成private static类型。      3、定义一个静态方法返回该类的实例。

(1)饿汉式

public class singletonTest{         private singletonTest(){}         private static final singletonTest instance=new singleTest();         public static singletonTest getInstance(){         return instance;             }       }

优点:不存在多线程同步的问题,避免了synchronized所造成的性能问题

缺点:当SingleTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间。从此以后,这个static的instance对象便一直占着这段内存,当类被卸载的时候,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。

(2)饱汉式(非线程安全)

public class SingletonTest{     private SingletonTest(){}     private static SingletonTest instance; //(不初始化,这里没有使用final关键字)     //定义一个静态的方法(调用时再初始化Sinleton,但多线程访问时,可能造成重复初始化的问题)     public static SingletonTest getInstance(){          if(instance==null)              instance=new SingletonTest();          return instance;     }}
**优点**:当类加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,节约了内存空间 **缺点**:并发条件下有可能出现多个SingletonTest实例。

(3)饱汉式(线程安全简单实现)

public class SingletonTest{     private SingletonTest(){}     private static SingletonTest instance;     public static synchronized SingletonTest getInstance(){     if(instance==null){     instance=new SingletonTest();}     return instance;}}

优点:使用synchronized关键字避免多线程访问时,出现多个SingletonTest实例
缺点:同步方法频繁调用时,效率略低

(4)兼顾安全与效率的写法

public class SingletonTest{     private SingletonTest(){}     private static SingleTest instance;     public static SingleTest getInstance(){     if(instance==null){         synchronized(Singleton.class){     if(instance==null){         instance=new SingletonTest();         }       }    }     return instance;  }}

(5)枚举写法(最好的单例写法)

public enum Singleton{     INSTANCE;     private String name;     public String getName(){     return name;     }     public void setName(String name){     this.name=name;     }}

关于枚举写法为什么更好,因为创建枚举默认就是线程安全的,枚举单例有序列化和线程安全的保证,而且只要几行代码就能实现单例最好的的实现方式,Effective Java里面有一条规则专门介绍。

0 0
原创粉丝点击