单例模式 - Singleton
来源:互联网 发布:Linux看主频命令 编辑:程序博客网 时间:2024/06/07 04:42
对今天学习的Singleton简单总结下:
定义:保证一个类只有一个实例,并提供一个访问它的全局访问点。
· private 构造函数;
· private static 成员变量:缓存实例;
· public static 方法:创建类实例;
作用:
- [1]. 保证唯一实例;
- [2]. 提供对唯一实例的受控访问。
多线程下的单例模式:
进程加锁 (懒汉式 -> 饿汉式) –> 双重锁定(Double-Check Locking) –> 静态内部类 –> 枚举
public class Singleton{ // 单例-懒汉式 private static Singleton instance; private Singleton() {} public static synchronized Singleton getInstace() { if(null==instance) instance = new Singleton(); return instance; }}
注:同步方法解决多线程问题。仅第一次设置instance需要同步,之后每次调用此方法,同步都是累赘降低性能。
public class Singleton{ // 单例-双重锁定(懒汉式改进版) private volatile static Singleton instance; private Singleton() {} public static Singleton getInstace() { if(null==instance){ synchronized(Singleton.class){ if(null==instance) instance = new Singleton(); } } return instance; }}
注:确保实例仅在未创建时加锁,亦能保证多线程安全。
volatile:避免内存模型允许的’无序写入’(某个线程可能会获得一个未完全初始化的实例)导致失败。
public class Singleton{ // 单例-饿汉式 private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstace() { return instance; }}
注:使用静态初始化(无需显示编写线程安全代码),加载时即实例化,提前占用系统资源。
public class Singleton{ // 静态内部类 private Singleton() {} private static class SingletonHelper{ private final static Singleton instance = new Singleton(); } public static Singleton getInstace(){ return SingletonHelper.instance; }}
注:加载时不会初始化静态变量instance,达到延时加载。
static:成员变量只保存一份副本;
final:保证变量不可变。
待续 = =
0 0
- 单例(Singleton)模式
- singleton 单例模式
- Singleton单例模式
- Singleton(单例)模式
- Singleton 单例模式
- 单例模式(Singleton)
- 单例模式(Singleton)
- Singleton(单例)模式
- Singleton(单例)模式
- 单例模式(Singleton)
- 单例模式(Singleton)
- 单例模式Singleton
- Singleton (单例模式)
- Singleton单例模式
- 单例模式----SingleTon
- 单例模式-singleton
- 单例模式(Singleton)
- Singleton(单例模式)
- linux线程5(百度知道上一道题)
- C# WINFORM 制作真正的 透明窗体 桌面画图 的完美解决方案
- 使用最新版本的Java EE eclipse构建webservice应用
- android基于Fragment实现底部导航切换
- Oracle中in和exists的区别
- 单例模式 - Singleton
- C++中的struct专题研究
- easyUI+mvc开发列表页页面渲染先出现编辑框和添加框
- 几个常见的C#小问题
- C 左移 右移 opration
- 图像处理中的数学原理详解(Part1 总纲)
- 百度地图定位和IP地址定位
- android listview 与手势冲突
- 理解JavaScript原型