> 文档中心 > 单例设计模式

单例设计模式


单例设计模式

所谓单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例

记忆技巧:懒汉式—太懒了,什么时候用,什么时候造

​ 饿汉式—太饿了,上来直接造好

1.饿汉式

package com.danli;public class Singleton01 {    public static void main(String[] args) { Bank bank = Bank.getBank(); Bank bank1 = Bank.getBank(); System.out.println(bank==bank1);    }}class Bank{    //1.私有化类的构造器(禁止其它类调用)    private Bank() {    }    //2.内部创建类的对象(必须是静态的)    private static Bank bank = new Bank();    //3.提供公共的静态方法,返回类的对象    public static Bank getBank() { return bank;    }}

2.懒汉式

下面这种方法的线程是不安全的

package com.danli;public class Singleton02 {    public static void main(String[] args) { Supermarket supermarket = Supermarket.getSupermarket(); Supermarket supermarket1 = Supermarket.getSupermarket(); System.out.println(supermarket==supermarket1);    }}class Supermarket{    //1.私有化类的构造器    private Supermarket() {    }    //2.声明当前类对象,不初始化(静态的)    private static Supermarket supermarket = null;    //3.声明public,static的返回当前类对象的方法    public static Supermarket getSupermarket() { if (supermarket==null){     supermarket = new Supermarket(); } return supermarket;    }}

以下,在getSupermarket方法上加上同步,此时线程是安全的

package com.danli;public class Singleton02 {    public static void main(String[] args) { Supermarket supermarket = Supermarket.getSupermarket(); Supermarket supermarket1 = Supermarket.getSupermarket(); System.out.println(supermarket==supermarket1);    }}class Supermarket{    //1.私有化类的构造器    private Supermarket() {    }    //2.声明当前类对象,不初始化(静态的)    private static Supermarket supermarket = null;    //3.声明public,static的返回当前类对象的方法    public static synchronized Supermarket getSupermarket() { if (supermarket==null){     supermarket = new Supermarket(); } return supermarket;    }}

3.两者的对比

饿汉式:对象加载时间过长,线程是安全的

懒汉式:延迟对象的创建,线程不安全(第一种写法)

开发者涨薪指南 单例设计模式 48位大咖的思考法则、工作方式、逻辑体系