首先我们要了解什么是单例模式。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供了访问这个实例的全局点。
JAVA实现单例模式的四种方法:
1.饿汉式
饿汉式意味着在我们使用类的时候,这个类已经被实例化了。饿汉模式的实现是在声明类的时候,就直接实例化一个静态对象,避免了线程安全的问题。
示例代码:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
2.懒汉式(非线程安全)
懒汉式的意思是在你真正调用类的实例时候才创建实例。这种方式在多线程情况下可能会出现多个实例的情况,因此这种方式不是线程安全的。
示例代码:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3.懒汉式(线程安全)
懒汉式(线程安全)的实现方式是在getInstance()方法上使用synchronized关键字保证线程安全。但这样会造成性能问题,因此这种方式一般不推荐使用。
示例代码:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
4.双重校验锁
双重校验锁是一种优化的懒汉式方式。先判断实例是否存在,如果不存在再进入同步代码块。在同步代码块中,再进行一次检查,如果仍不存在,则创建新实例。这种方式既保证了线程安全性,又提高了性能。
示例代码:
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
以上就是JAVA实现单例模式的四种方式,你可以根据实际需求选择不同的方式。
需要注意的是,在使用单例模式时需要考虑线程安全性问题。为了保证线程的安全性,第三种和第四种方式引入了synchronized关键字或volatile关键字,但是这样会影响系统的性能,因此我们在使用时应该根据系统的实际需求进行选择。
附加一些特点:单例模式的特点是只有一个类实例,因此它可以节省内存空间。但如果一个系统中有多个实例,那么它就不能满足需求。单例模式一般用于工具类、操作频繁的对象等。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA实现单例模式的四种方法和一些特点 - Python技术站