设计模式-单例模式
来源:互联网 发布:java数据脱敏技术 编辑:程序博客网 时间:2024/05/22 02:46
单例模式
单例模式的要点:
1、将采用单例模式的类的构造方法私有化。 2、在其内部产生该类的实例化对象,并将其封装成private static类型。 3、定义一个静态方法返回该类的实例。
(1)饿汉式
public class singletonTest{ private singletonTest(){} private static final singletonTest instance=new singleTest(); public static singletonTest getInstance(){ return instance; } }
优点:不存在多线程同步的问题,避免了synchronized所造成的性能问题
缺点:当SingleTest被加载的时候,会初始化static的instance,静态变量被创建并分配内存空间。从此以后,这个static的instance对象便一直占着这段内存,当类被卸载的时候,静态变量被摧毁,并释放所占有的内存,因此在某些特定条件下会耗费内存。
(2)饱汉式(非线程安全)
public class SingletonTest{ private SingletonTest(){} private static SingletonTest instance; //(不初始化,这里没有使用final关键字) //定义一个静态的方法(调用时再初始化Sinleton,但多线程访问时,可能造成重复初始化的问题) public static SingletonTest getInstance(){ if(instance==null) instance=new SingletonTest(); return instance; }}
**优点**:当类加载的时候,静态变量static的instance未被创建并分配内存空间,当getInstance方法第一次被调用时,初始化instance变量,并分配内存,节约了内存空间 **缺点**:并发条件下有可能出现多个SingletonTest实例。
(3)饱汉式(线程安全简单实现)
public class SingletonTest{ private SingletonTest(){} private static SingletonTest instance; public static synchronized SingletonTest getInstance(){ if(instance==null){ instance=new SingletonTest();} return instance;}}
优点:使用synchronized关键字避免多线程访问时,出现多个SingletonTest实例
缺点:同步方法频繁调用时,效率略低
(4)兼顾安全与效率的写法
public class SingletonTest{ private SingletonTest(){} private static SingleTest instance; public static SingleTest getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance==null){ instance=new SingletonTest(); } } } return instance; }}
(5)枚举写法(最好的单例写法)
public enum Singleton{ INSTANCE; private String name; public String getName(){ return name; } public void setName(String name){ this.name=name; }}
关于枚举写法为什么更好,因为创建枚举默认就是线程安全的,枚举单例有序列化和线程安全的保证,而且只要几行代码就能实现单例最好的的实现方式,Effective Java里面有一条规则专门介绍。
0 0
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 设计模式-单例模式
- [设计模式] 单例模式
- 设计模式--单例模式
- 设计模式---单例模式
- 设计模式--单例模式
- 设计模式 -----单例模式
- 设计模式:单例模式
- 视频播放器(SurfaceView+MediaPlayer+SeekBar,VideoView+MediaController)
- 安卓漫漫路之AndroidManifest权限大全.
- 正则表达式2(常用)
- Opencv2系列学习笔记4(灰度直方图)
- 对目录内所有文件(包括子文件夹文件)读取处理
- 设计模式-单例模式
- POJ-3087 Shuffle'm Up
- 十八、Hive 中UDF编程
- 21天学通C++之C++程序的组成部分
- 文章标题
- hdu 2222 ac自动机模板题
- Android自定义闹钟
- 循环,运算符,语句块,typedef工具,字符输入get(),文件尾条件,二维数组,时间clock()
- ZOJ 3631 Watashi's BG DFS