一个简单的单列模式示例:
public class SingletonDemo { private static SingletonDemo singletonDemo; private SingletonDemo(){//构造函数私有化(在外部类中无法直接new对象) } public static SingletonDemo getInstance(){//实例化对象方法(外部函数只能通过这个方法实例化) if(singletonDemo==null){ singletonDemo=new SingletonDemo(); } return singletonDemo; } }
单例模式是一种广泛使用的设计模式,单例模式的作用是保证在在java程序中,某个类只有一个实例存在,这样能减少对象的重复创建,提高性能。
单例模式分为多种:1、懒汉模式 2、饿汉模式 3、登记式单例
1、懒汉模式
public class SingletonDemo {
private static SingletonDemo singletonDemo;
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
if(singletonDemo==null){
singletonDemo=new SingletonDemo();
}
return singletonDemo;
}
}
这种模式采用了延迟加载的策略,在需要创建对象的时候调用类提供的方法创建。这种模式有一个缺点,如果在多线程并发的情况下,
可能会重复创建对象,所以适合在单线程的环境下用
线程安全的懒汉
public class SingletonDemo {
private static SingletonDemo singletonDemo;
private SingletonDemo(){
}
public static synchronized SingletonDemo getInstance(){
if(singletonDemo==null){
singletonDemo=new SingletonDemo();
}
return singletonDemo;
}
}
加上synchronize修饰可以保证线程安全,但是这样会造成资源浪费,效率低下
2、饿汉模式
public class SingletonDemo {
private static SingletonDemo singletonDemo=new SingletonDemo();
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
return singletonDemo;
}
}
这种模式在类加载的时候就已经创建了类的实例,可以避免懒汉模式的多线程并发的问题。缺点是如果实例还不需要创建的话,但是
在类加载的时候就创建了,这样就浪费内存了,如果单例占用的内存比较大,这就不合适了
双重校验锁法
public class SingletonDemo {
private static SingletonDemo singletonDemo;
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
if(singletonDemo==null){
synchronized (SingletonDemo.class){//线程同步
if(singletonDemo==null){
singletonDemo=new SingletonDemo();
}
}
}
return singletonDemo;
}
}
这种方式解决了线程安全和资源浪费的问题
静态代码块
public class SingletonDemo {
private static class singletonCreate{
private static SingletonDemo singletonDemo=new SingletonDemo();
}
private SingletonDemo(){
}
public static SingletonDemo getInstance(){
return SingletonDemo.singletonCreate;
}
}
这种方式是采用懒汉模式,但是是线程安全,资源浪费的问题也解决了
枚举
public enum SingletonDemo { instance; public void whateverMethod(){ } }这种方式是最优,但是不好理解,很少这样写
双重校验锁和静态代码块是用的比较多的