单列模式
来源:互联网 发布:淘宝评价回复感谢语 编辑:程序博客网 时间:2024/05/23 15:40
懒汉式:
public class SingletonClass{
private static SingletonClass mSingletonClass;
private Singleton(){}
public static SingletonClass getInstance(){
if(mSingletonClass == null){
mSingletonClass = new SingletonClass();
}
return mSingletonClass;
}
}
饿汉式:
public class SingletonClass{
private static SingletonClass mSingletonClass = new SingletonClass();
private SingletonClass(){}
public static SingletonClass getInstance(){
return mSingletonClass;
}
}
上面的单列模式并不是完美的,通过反射可以创建不同的实例(通过获取类的构造器,来进行实例化),所以得改一改
public class SingletonClass{
private static SingletonClass mSingletonClass;
private Singleton(){
if (mSingletonClass != null){
throw new RuntimeException("error");
}
}
public static SingletonClass getInstance(){
if(mSingletonClass == null){
mSingletonClass = new SingletonClass();
}
return mSingletonClass;
}
}
如果俩个线程同时初始化单列类,有可能会创建不同的实例
public class SingletonClass{
//这里使用volatile关键字才能保证线程的安全,如果只是单纯的同步的话,
//可能在类正在初始化未完成时应用它
private static volatile SingletonClass mSingletonClass;
private Singleton(){
if (mSingletonClass != null){
throw new RuntimeException("error");
}
}
//也可以对此方法进行同步,不过会有额外开销
public static SingletonClass getInstance(){
俩次检查,并且是在单列类为空时才进行同步创建
if(mSingletonClass == null){
synchronized(SingletonClass.Class){
if(mSingletonClass == null){
mSingletonClass = new SingletonClass();
}
}
}
return mSingletonClass;
}
最后啦,让单列序列化安全
public class SingletonClass{
private static volatile SingletonClass mSingletonClass;
private Singleton(){
if (mSingletonClass != null){
throw new RuntimeException("error");
}
}
public static SingletonClass getInstance(){
if(mSingletonClass == null){
synchronized(SingletonClass.Class){
if(mSingletonClass == null){
mSingletonClass = new SingletonClass();
}
}
}
return mSingletonClass;
}
protected SingletonClass readResolve(){
return getInstance();
}
}
public class SingletonClass{
private static SingletonClass mSingletonClass;
private Singleton(){}
public static SingletonClass getInstance(){
if(mSingletonClass == null){
mSingletonClass = new SingletonClass();
}
return mSingletonClass;
}
}
饿汉式:
public class SingletonClass{
private static SingletonClass mSingletonClass = new SingletonClass();
private SingletonClass(){}
public static SingletonClass getInstance(){
return mSingletonClass;
}
}
上面的单列模式并不是完美的,通过反射可以创建不同的实例(通过获取类的构造器,来进行实例化),所以得改一改
public class SingletonClass{
private static SingletonClass mSingletonClass;
private Singleton(){
if (mSingletonClass != null){
throw new RuntimeException("error");
}
}
public static SingletonClass getInstance(){
if(mSingletonClass == null){
mSingletonClass = new SingletonClass();
}
return mSingletonClass;
}
}
如果俩个线程同时初始化单列类,有可能会创建不同的实例
public class SingletonClass{
//这里使用volatile关键字才能保证线程的安全,如果只是单纯的同步的话,
//可能在类正在初始化未完成时应用它
private static volatile SingletonClass mSingletonClass;
private Singleton(){
if (mSingletonClass != null){
throw new RuntimeException("error");
}
}
//也可以对此方法进行同步,不过会有额外开销
public static SingletonClass getInstance(){
俩次检查,并且是在单列类为空时才进行同步创建
if(mSingletonClass == null){
synchronized(SingletonClass.Class){
if(mSingletonClass == null){
mSingletonClass = new SingletonClass();
}
}
}
return mSingletonClass;
}
}
还有一种保证线程安全的单列方法:
public class SingletonClass{
private Singleton(){
}
public static SingletonClass getInstance(){
return SingletonHolder.sInstance;
}
//静态内部类
private static class SingletonHolder{
private static final Singleton sInstance = new SingletonClass();
}
}
最后啦,让单列序列化安全
public class SingletonClass{
private static volatile SingletonClass mSingletonClass;
private Singleton(){
if (mSingletonClass != null){
throw new RuntimeException("error");
}
}
public static SingletonClass getInstance(){
if(mSingletonClass == null){
synchronized(SingletonClass.Class){
if(mSingletonClass == null){
mSingletonClass = new SingletonClass();
}
}
}
return mSingletonClass;
}
protected SingletonClass readResolve(){
return getInstance();
}
}
阅读全文
0 0
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- 单列模式
- Python编辑器sublime text3环境配置
- [2016陕西省赛D] Rui and her triangles
- C++ 模板学习总结(四)函数模板
- 深入分析Spring 与 Spring MVC容器
- 求分数的精确值
- 单列模式
- [国嵌学习日志][113][字符设备驱动模型]
- POJ3579-Median
- linux系统下动静态库的制作
- Spark源码学习笔记8-TaskScheduler
- 网站实施--头部导航 样式的控制
- Windows交互服务
- 数组式方式访问对象(ArrayAccess)
- UNP-第六章 I/O复用 select 和poll函数 学习笔记