什么是单例:
一个类在整个系统中只有一个实例,而且这个实例在类的内部由private构造的,外部不能直接调用其构造方法,只能获取它的实例.
单例模式的优点:
在内存中只有一个实例对象,节省内存空间.避免重复的创建和销毁对象,可以提高性能,避免对多重资源的重复占用,可以全局进行访问.
单例模式的使用场景:
需要频繁的实例化和销毁的对象.有状态的工具类对象,频繁访问数据库或文件对象.
eg:(静态内部类)
public class SingleInstance{
private static class InstanceHolder{
public static final SingleInstance instance=new SingleInstance();
}
public static SingleInstance getInstance(){
return InstanceHolder.instance;
}
}
eg:(懒汉单列模式)
//懒汉单例模式,在第一次调用时候实例化自己
public class Singleton {
private Singleton() {
}
private static Singleton single = null;
// 静态工厂方法
public static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
}
加同步锁可以变线程安全的单例
public static synchronized Singleton getInstance(){
if (single == null) {
single = new Singleton();
}
return single;
}
eg:饿汉单例模式
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
private Singleton1() {}
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
外部获取instance实例,而不是new一个对象.
Sgingleton obj=Singleton.getInstance();