单例模式(懒汉式、饿汉式)

.单例模式

什么是单例模式?(只有一个自己在堆内存中所创建的实例)

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;
    }
}

 

posted @ 2018-03-19 19:34  贰零一八  阅读(289)  评论(0编辑  收藏  举报