单例模式:
定义是单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例。
场景:比如创建连接池的时候,显而易见,连接池在这一个项目中只能存在一个,那么我们去创建它的时候就必须保证任何时候项目中只存在这一个连接池。那么我们什么时候去创建这个池子呢?继而产生两种思路去创建这个池子,第一种就是在我们想要使用连接池的时候去创建它,我们称之为懒汉式,还有一种就是在初始化的时候我们就已经创建好这个连接池了,我们称之为饿汉式。下面分别用两个小demo练习一下这两种方法。
懒汉式:
基本代码:
public class singleton{
private static Singleton singleton = null ;
public static Singleton getInstance(){
if (singleton == null ){
singeleton = new Singleton();
}
return singeleton;
}
}
为了解决线程安全问题
1、同步机制
public class singleton{
private static Singleton singleton = null ;
public static synchronized Singleton getInstance(){
if (singleton == null ){
singeleton = new Singleton();
}
return singeleton;
}
}
2、双重检查锁定
public class singleton{
private static Singleton singleton = null ;
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
3、静态内部类
public class Singleton {
private static class LazyHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
饿汉式:
public class singleton{
private static Singleton singleton = new Singleton();
public static Singleton getInstance() {
return singleton;
}
}
饿汉式和懒汉式区别:
饿汉式是类初始化的时候就已经new出singleton这个实例,保证在调用getInstance方法的时候,实例已经存在,本身就是线程安全的。
懒汉式时只在调用getInstance方法的时候才会去创建第一个实例,下次再次调用的时候就不用去创建实例了。
懒汉式需要考虑线程安全问题,可以用上面三种方式解决。