设计模式---单例模式
程序员文章站
2024-03-23 14:29:22
...
单例模式定义
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式写法
单例模式分为饿汉模式和懒汉模式
1.饿汉模式(静态常量)
/**
* 饿汉模式(静态常量),即在类加载的时候就实例化
*/
public class SingletonPattern {
private static SingletonPattern instance = new SingletonPattern();
private SingletonPattern() {
}
public static SingletonPattern getInstance() {
return instance;
}
}
这种写法就是饿汉模式,在类加载的时候就进行单例对象的实例化,避免了同步问题。不过有一点不好的是,如果该单例对象没有被使用的话,就会造成内存浪费。
2.饿汉模式(静态代码段)
/**
* 饿汉模式(静态代码块),即在类加载的时候就实例化
*/
public class SingletonPattern2 {
private static SingletonPattern2 instance;
static {
instance = new SingletonPattern2();
}
private SingletonPattern2() {
}
public static SingletonPattern2 getInstance() {
return instance;
}
}
这个写法和上面大同小异,只不过是把单例对象的实例化放在静态代码段中,同样,这也是线程安全的。
3.懒汉模式(同步方法)
/**
* 懒汉模式(同步方法)
*/
public class SingletonPattern3 {
private static SingletonPattern3 instance;
private SingletonPattern3() {
}
public static synchronized SingletonPattern3 getInstance() {
if (instance == null) {
instance = new SingletonPattern3();
}
return instance;
}
}
这种写法就是通过同步方法实现的懒汉模式,虽然避免了同步问题,但是由于在方法上加了同步关键字,故效率会不理想。
4.懒汉模式(双重检查)
/**
* 双重检查
*/
public class SingletonPattern4 {
private static volatile SingletonPattern4 instance;
private SingletonPattern4() {
}
public static SingletonPattern4 getInstance() {
if (instance == null) {
synchronized(SingletonPattern4.class) {
if (instance == null) {
instance = new SingletonPattern4();
}
}
}
return instance;
}
}
这种写法使用了双重检查的思想,单例对象instance要声明为volatile,这样在第二次检查instance是否为null的时候就能起到同步作用,所以该写法是线程安全的。
5.懒汉模式(静态内部类)
/**
* 静态内部类方式
*/
public class SingletonPattern5 {
private SingletonPattern5() {
}
private static class SingletonInstance {
private static SingletonPattern5 instance = new SingletonPattern5();
}
public static SingletonPattern5 getInstance() {
return SingletonInstance.instance;
}
}
这种写法利用了jvm加载类机制的特点来保证单例对象只实例化一次,因为jvm在加载类和初始化的时候只有一个线程,这样就保证了线程安全。
上一篇: Java charAt() 方法
下一篇: Java面试宝典