什么是单例模式?
单例模式就是在JVM中一个对象只能有一个实例。
单例模式有七种写法,常见的单例模式有两种:懒汉式、饿汉式
什么是懒汉式?
就是需要的才会去实例化,线程不安全。
什么是饿汉式?
就是当class文件被加载的时候就已经初始化,天生线程安全。
懒汉式写法
/**
* 保证这个类在JVM中只有一个实例化对象
*/
class Singleton{
private static Singleton singleton;
//怎样解决不让无限new的问题?让构造函数私有化
//但是这样有一个缺点:反射不能在通过构造函数初始化了
private Singleton() {
}
/*
* 懒汉式就是当你需要的时候才会被实例化,之后用的都是同一个实例
* 但是懒汉式线程不安全,当两个线程同时执行getSingleton方法时,可能会new两个
* Singleton,违背了单例的原则
* 会发生线程不安全问题,所以需要加上同步
*/
static public Singleton getSingleton() {
if(singleton==null) {
synchronized (Singleton.class) {
singleton=new Singleton();
}
}
return singleton;
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1=Singleton.getSingleton();
Singleton singleton2=Singleton.getSingleton();
//为true,说明两者是同一个实例
System.out.println(singleton1==singleton2);
}
}
饿汉式写法
/**
* 饿汉式:就是当class文件被加载的时候,就会被初始化,天生线程安全
*/
class Singleton1{
//用final修饰后,只能被初始化一次,以后不能再被更改
private static final Singleton1 singleton1=new Singleton1();
private Singleton1() {
}
static public Singleton1 getSingleton() {
return singleton1;
}
}
public class SingletonTest2 {
public static void main(String[] args) {
Singleton1 singleton1=Singleton1.getSingleton();
Singleton1 singleton2=Singleton1.getSingleton();
//为true,说明两者是同一个实例
System.out.println(singleton1==singleton2);
}
}
总结:
懒汉式就是当你需要使用的时候才会被初始化,之后都是用一个实例,但是线程不安全,需要使用synchronized进行同步。
饿汉式就是当class文件被加载的时候,就会被初始化,天生线程安全。