1、单例模式:
某个类在程序运行的整个阶段中只有一个对象实例;
使用单例模式的好处是节省一些系统开销,减少不必要的内存支出;
实现单例的方式:
1)饿汉式:
public class Test{
public static void main(String[] args){
Main main = Main.getInstance();
}
}
/**
* 单例模式的实现:
* 首先是要将构造器私有化,不能让外部对象直接调用构造方法,破坏了单一性质
* 其次是将对象也是私有化,只提供一个公共静态方法可以获取到唯一的一个实例对象
*/
//饿汉式实现;优点:天生就是线程安全的;缺点就是需要一开始就已经初始化了,占用资源
class Main{
private static Main instance = new Main();
private Main(){}
public static Main getInstance(){
return instance;
}
}
2)懒汉式:
//写法二(线程安全的):
/**
* 给getInstance()方法加上同步关键字之后,就可以解决问题
* 但是这个方法的缺点是每一个调用的线程都要进行一次等待
*/
class Main{
private static Main instance = null;
private Main{}
public static synchronized Main getInstance(){
if(instance == null){
instance = new Main();
}
return instance;
}
}
//写法三(线程安全的):
/**
* 对上面方法二进行一个改进;
* 双重判断机制,第一个判断条件是避免多余地等待获取锁;
* 有个小小的问题就是会在第一次加载的时候消耗比较多的时间
* 牺牲时间换取安全性,这里的开销不会太大
*/
class Main{
private static Main instance = null;
private Main{}
public static Main getInstance(){
if(instance == null){
synchronized(Main.class){
if(instance == null){
instance = new Main();
}
}
}
return instance;
}
}
//写法四(线程安全的):
/**
* 利用静态内部类来获取单例对象
* 在Main被初始化的时候,并不会将main初始化;
* 直到getInstance方法被调用的时候才会将main初始化
*/
class Main{
public static Main getInstance(){
return MainProductor.main;
}
private static class MainProductor{
private static final Main main = new Main();
}
}