Java中单例模式的七种写法示例
什么是单例模式?
单例模式是一种创建型设计模式,它保证某个类在应用程序中只有一个对象实例存在。
在应用程序中,有些实例对象需要全局唯一,比如数据库连接实例、日志记录实例等,此时就可以使用单例模式来确保只创建一个对象实例,以达到节约系统资源的目的。
单例模式的七种实现方式
1. 饿汉式单例模式
public class Singleton1{
private static Singleton1 instance = new Singleton1();
private Singleton1(){}
public static Singleton1 getInstance() {
return instance;
}
}
在类加载时,就创建了静态的实例对象,保障了在多线程环境下也能保证唯一的实例对象。
此方式的缺点是:在应用程序启动时,就创建了实例对象,占用了一部分JVM内存,如果这个对象无法在应用程序启动后被调用,就浪费了系统资源,且不能实现懒加载,需要时间和空间上的代价。
2. 懒汉式单例模式(线程不安全)
public class Singleton2{
private static Singleton2 instance;
private Singleton2(){}
public static Singleton2 getInstance() {
if(instance == null) {
instance = new Singleton2();
}
return instance;
}
}
此方式是懒汉式的单例模式,只有在调用该方法时才会创建并返回实例对象,但是,在多线程环境下,可能会出现多个实例对象的情况。
3. 懒汉式单例模式(线程安全,效率低)
public class Singleton3{
private static Singleton3 instance;
private Singleton3(){}
public static synchronized Singleton3 getInstance() {
if(instance == null) {
instance = new Singleton3();
}
return instance;
}
}
考虑到线程安全问题,该方法添加了synchronized
关键字,保证只有一个线程可以访问创建实例对象的过程,保证线程安全。但是,由于该方法在整个过程中只有一个线程可以执行,因此会带来效率低下的问题。
4. 双重检查锁单例模式(线程安全)
public class Singleton4{
private volatile static Singleton4 instance;
private Singleton4(){}
public static Singleton4 getInstance() {
if(instance == null) {
synchronized (Singleton4.class) {
if(instance == null) {
instance = new Singleton4();
}
}
}
return instance;
}
}
该方法对懒汉式方法进行了优化,利用双重检查锁定机制,在多线程环境下保证只创建唯一的实例对象、线程安全,同时,在实例对象创建完成后,其他线程可以直接访问实例对象。 使用volatile关键字可以保证线程间变量的可见性,从而保证线程安全。
5. 静态内部类单例模式
public class Singleton5{
private Singleton5(){}
private static class SingletonHolder{
private static final Singleton5 INSTANCE = new Singleton5();
}
public static Singleton5 getInstance() {
return SingletonHolder.INSTANCE;
}
}
采用静态内部类的方式,保证实例对象唯一,线程安全,同时具有懒加载的優點。
6. 枚举写法单例模式
public enum Singleton6 {
INSTANCE;
public static Singleton6 getInstance() {
return INSTANCE;
}
}
JDK1.5开始支持枚举类型。这种方式在多线程环境下也可以保证实例对象唯一、线程安全,并且可以防止反射机制和反序列化攻击。
7. ThreadLocal单例模式
public class Singleton7{
private static final ThreadLocal<Singleton7> threadLocalInstance = new ThreadLocal<Singleton7>() {
@Override
protected Singleton7 initialValue() {
return new Singleton7();
}
};
private Singleton7(){}
public static Singleton7 getInstance() {
return threadLocalInstance.get();
}
}
采用ThreadLocal
的方式,保证单例对象的唯一性,在多线程环境下也能够保证线程安全。
小结
以上是Java中七种单例模式的实现方式,每种方式都可以应对不同情况下的开发需求。在实际应用中,可以选择最适合自己需求的方式进行使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中单例模式的七种写法示例 - Python技术站