java单例模式
单例模式是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
目录
单例模式的特点:
优点:
缺点:
单例模式的特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
优点:
1、在内存里只有一个实例,减少了内存的开销。
2、避免对资源的多重占用。
缺点:
没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
单例模式的几种实现方式:
1.懒汉式(线程不安全)
public class testObject{
//创建一个对象
private static testObject instance;
//一个私有的构造方法,保证该对象不会被new出来
private testObject(){}
//获取唯一可用对象
public static testObject getIstance(){
if(instance == null){
instance = new instance;
}
return instance;
}
public void showMessage(){
System.out.println("Hello Java!");
}
}
2.懒汉式(线程安全)
public class testObject{
private static testObject instance;
private testObject(){}
//同步方法保证在多线程下也能拿到唯一实例
public static synchronized testObject getInstance(){
if(instance == null){
instance = new testObject();
}
return instance;
}
public static void showMessage(){
System.out.println("Hello Java!");
}
}
3.饿汉式(线程安全)
public class testObject{
//直接初始化
private static testObject instance = new testObject();
private testObject(){}
public static testObject getInstance(){
return instance;
}
}
4.双重检查(线程安全)
public class testObject{
//volatile关键字修饰
private volatile static testObject instance;
private testObject(){}
public static testObject getInstance(){
if(instance == null){
synchronized(testObject.class){
if(instance == null){ //这里可能线程不安全,需要加valotile关键字,刷新其他线程引用缓存
instance = new testObject();
}
}
}
return instance;
}
}
一般情况下,不建议使用第 1 种和第 2 种懒汉方式,建议使用第 3 种饿汉方式。