单例模式
什么是单例模式
单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。
单例模式的设计思路:
1.将构造函数私有化,保证类外部不能使用new关键字自行创建对象
2.在类内部实例化一个对象并通过 静态方法返回
单例模式的实现方式:
1.饿汉式单例模式
class Singleton{ private Singleton(){ System.out.println("单例模式"); } private static Singlleton single=new Singlleton(); Public static Singleton getInstance(){ return singleton; } }
缺点:在一加载的时候就实例化,提前占用系统资源
优点:线程安全
2.懒汉式单例模式 synchronized
class Singleton{ private static Singleton single=null; public static synchronized Singleton getInstance(){ if(singleton==null){ //只在null的时候实例化 singleton=new Singleton(); } return singleton; } }
优点:解决了饿汉模式一加载就占用资源的问题
缺点:线程不安全。每次都需要锁住方法,只允许一个线程访问,效率低下
synchronized:将一个方法或代码块锁住,同一时间只允许一个代码访问
3.双重加锁的懒汉模式
class Singleton{ private static Singleton=null; public static synchronized Singleton getInstance(){ if(singleton==null){ synchronized(Singleton.class){//锁住那个类的对象 if(singleton==null){ singleton=new Singleton(); } } } return singleton; } }
只有当第一次singleton为null的时候,才进行线程锁
当后续singleton不为null时,可以允许多个线程同时拿走singleton
4.静态内部类实现单例
private static class Singleton1{ private static Singleton singleton=new Singleton(); } public static Singleton getInstance(){ return Singleton1.singleton; }
解决了饿汉式提前占用资源的问题,解决了懒汉式线程不安全的问题