一.单例模式
什么是单例模式?(只有一个自己在堆内存中所创建的实例)
1.单例模式有以下的特点?
1)单例类只能有一个实例
2)单例类必须自己创建自己的唯一实例
3)单例类必须给所有其他对象提供这一实例
//减少堆内存的占用
2.单例模式分类?
1)懒汉式:第一次在调用自己的时候实例化自己。
2)饿汉式:在类初始化时,自己自行实例化
package DesignModel; public class Singleton { /* *懒汉式:第一次在调用自己的时候实例化自己。 */ private static Singleton singleton; //为什么要定义为私有?看看蓝白书,因为只能在本类内部才能返回创建它的对象 public synchronized static Singleton getInstance(){ //加个锁,这样的话,就可以解决线程不安全的问题synchronized //锁和同步有什么区别吗?是同一个东西吗?锁是一种机制,而同步包含锁,其实异步也可以加锁。 if (singleton==null){ singleton=new Singleton();//new一个类 } return singleton;//成员属性 } /*实例化Singleton类*/ } /* *饿汉式单例类,在类初始化时,自己自行实例化 */ class Singleton1{ private static Singleton1 singleton1=new Singleton1(); //static地址唯一 public static Singleton1 getInstance(){ //查getInstance(),表示返回一个实例对象 /*在未调用getInstance这个方法之前就立马的实例化了, 即提前初始化,所以会浪费内存,但如果是多线程的情况下, 可能一个类会被加载多次,而这就违背了单例模式的特点了, 所以从这点来讲的话,饿汉比懒汉式更安全*/ return singleton1; //若它也用Singleton方式来创建对象,再用==来判断也是true } } class TestSingleton{ public static void main(String[] args) { Singleton instance1=Singleton.getInstance(); Singleton instance2=Singleton.getInstance(); Singleton instance3=new Singleton(); Singleton instance4=new Singleton(); System.out.println(instance1==instance2);//true System.out.println(instance3==instance4);//false,在堆内存中有两块 //判断内存的地址是否相同,相当于在JVM的堆内存中只是存放了一个,只能初始化一次 Singleton1 singleton1=Singleton1.getInstance(); Singleton1 singleton2=Singleton1.getInstance(); System.out.println(singleton1==singleton2);//true } }
3.懒汉式和饿汉式的区别?
懒汉式:第一次在调用自己的时候实例化自己。
饿汉式:在类初始化时,自己自行实例化
因为这个概念的缘由,所以饿汉式比懒汉式更安全。
(但如果是多线程的情况下,可能一个类会被加载多次,而这就违背了单例模式的特点了, 所以从这点来讲的话,饿汉比懒汉式更安全)
懒汉式框架: public class Singleton { /* *懒汉式:第一次在调用自己的时候实例化自己。 */ private static Singleton singleton; public synchronized static Singleton getInstance(){ if (singleton==null){ singleton=new Singleton();//new一个类 } return singleton;//成员属性 } /*实例化Singleton类*/ } 饿汉式框架: class Singleton1{ /* *饿汉式单例类,在类初始化时,自己自行实例化 */ private static Singleton1 singleton1=new Singleton1(); //static地址唯一 public static Singleton1 getInstance(){ return singleton1; } }