单例模式需要:
- 构造方法私有化
- 提供一个自身的私有静态成员变量
提供一个公有的静态工厂方法
一、饿汉式
在定义静态变量的时候就实例化单例类。
根据类加载机制,在加载,链接(验证,准备,解析)的阶段,单例类中的静态变量已经被分配了内存,并且设置了变量的初始化的值。这个在运行的时候只要初始化就行了,就比懒汉式节省时间了。
这是我个人的理解,因为我在运行如下实验代码的时候,如果不出现SingleTon1类的时候,这个类的静态代码块和构造函数被没有运行,说明没有进行初始化。
因为类执行初始化的操作的情况只有以下几种,这个在我别的博客中提到了。
二、懒汉式
在调用静态方法的时候才实例化单例类
代码如下:
public class Solution {
public static void main(String[] args) {
//Singleton1 s = new Singleton1();
//Singleton1 s = Singleton1.getInstance();
//s.print();
// Singleton s1 = Singleton1.getInstance();
// s1.print();
// System.out.println(s == s1);
System.out.println("-----------------");
//Singleton1.getInstance();
}
}
//饿汉式:占用内存时间长,提高效率
class Singleton1{
static {
System.out.println("测试有没有被加载");
}
private Singleton1(){
System.out.println("构造函数用到啦");
};
private final static Singleton1 s = new Singleton1();
public static Singleton1 getInstance(){
return s;
}
public void print(){
System.out.println("测试方法");
}
}
//懒汉式:占用内存的时间短,效率低(懒加载,延迟加载)
//在多线程访问时会有安全问题
class Singleton2{
private Singleton2(){};
private static Singleton2 s;
public static Singleton2 getInstance(){
if (s == null){
s = new Singleton2();
}
return s;
}
public void print(){
System.out.println("测试方法");
}
}