写在前面
特点:
- 构造函数私有化即不能再通过new进行实例化;
- 唯一实例;
优点:
- 在内存里只有一个实例,减少内存开销,尤其是频繁的创建和销毁实例;
- 避免对资源的多重占用(文件读写操作);
缺点:
- 没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外部怎样实例化;
懒汉式
public class LazySingleton
{
private static LazySingleton instance;
private LazySingleton(){}
public static synchronized LazySingleton getInstance(){//加synchronized同步锁懒汉式就线程安全,否则线程不安全
if(instance==null){
instance = new LazySingleton();
}
return instance;
}
}
懒汉式线程不安全解决方法:在getInstance()方法加入同步锁synchronized;
饿汉式
public class StarveSingleton
{
private static StarveSingleton instance = new StarveSingleton();
private StarveSingleton(){}
public static StarveSingleton getInstance(){
return instance;
}
}
饿汉式线程安全;
写在后面
懒汉与饿汉的区别:
顾名思义,懒汉式比较懒,没有在最开始对instance属性进行初始化;饿汉是一开始就进行初始化。