设计模式-单例模式
文章来自 shichang // Welcome!
主页
|
About Me
|
归档
|
标签
单例模式:一个类只能有一个实例,并且整个项目都能访问该实例,私有化构造方法,私有化静态实例,通过方法提供给外部访问实例,根据实例的创建时间不同单例模式可以分为饿汉式和懒汉式两种 ### 饿汉式:实例在类加载时创建 ```java public class Instance{ private static Instance instance = new Instance(); private Instance(){} public static Instance getInstance(){ return instance; } } ``` 缺点:实例在类加载时创建,有可能初始化得太早,造成资源浪费 ### 懒汉式:实例在第一次使用时创建 有三种实现方法: 1. 基本实现 ```java public class Instance{ private static volatile Instance instance = null; private Instance(){} public static Instance getInstance(){ if(instance == null){ synchronized(Instance.class){ if(instance == null){ instance = new Instance(); } } } return instance; } } ``` 比较复杂,有三个特点,1.volatile关键字,防止指令重排,将对对象的读写操作分开,在对象没有被赋值之前不会调用对它的写操作。对象的创建分为三个步骤(给对象分配内存,调用构造函数初始化,将对象指向分配的内存空间),对象指向内存空间后便不再是null。这时有可能先给对象进行的第三步,对象已经不为null了但是还没有初始化,其他线程进入第一个if时,便直接通过,将返回的instance拿去使用,造成危险;2.双重检查,提高效率,不让其他线程因为锁而阻塞(每个线程都将会尝试加锁然后判断是否为空,强制其他线程等待);3.synchronized关键字,保证实例的唯一性(不能让多个线程执行new语句)。 <br> 2. 静态内部类 ```java public class Instance{ private static class InstanceHolder{ private static final Instance instance = new Instance(); } private Instance(){} public static final Instance getInstance(){ return InstanceHolder.instance; } } ``` 从外部看是懒汉式,从内部看是饿汉式,由ClassLoader保证同步 <br> 3. 枚举 ```java public enum Instance{ INSTANCE; public void function(){ //do something } } ``` 使用方法Instance.INSTANCE.function(); 自动序列化机制 q单例模式的业务场景
Pre:
异常
Next:
docker + shadowsocks代理搭建