java设计模式之单例模式
来源:互联网 发布:excel对比数据 编辑:程序博客网 时间:2024/06/17 13:55
定义
-单例模式是用来创建独一无二,只能有一个实例的对象的模式(确保一个类只有一个实例,并提供一个全局访问点)
-应用的场景:主要应用于只需要一个对象的地方,eg:线程池(threadpool),缓存(cache),日志对象等。
-在学习单例模式之前的可能想法,通过开发者之间的约定或者通过java的静态变量就可能能做到
-这种方法可能产生的问题是:如果把对象赋值给一个全局变量,那么全局对象就要在程序一开始之前就创建好,假设这个对象非常耗费资源我们用到它的地方又不多,就会形成资源的浪费,单例产生的对象就能在我们需要它的时候才创建对象
-那么问题来了,如何保证对象只被创建一次
public class Singleton()
{
private static Singleton uniqueInstance;
//用一个静态变量来申明唯一实例
private Singleton(){}
//私有构造方法,别人不可以调
public static Singleton getInstance(){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}//实例化getInstance返回实例
return uniqueInstace;
}
}
再谈
-对于管理资源这是一个很好的设计模式
-确定只有一个实例的原因是此类的构造器是私有的,要获得实例,必须通过静态方法getInstance
类图如下
ps:单例可以延迟实例化
以上所谈都是基于单线程的现在扩展到多线程,根据os的概念,自行理解多线程的情况(主要是可能不止一个实例)
public class Singleton(){
private static Singleton uniqueInstance;
private Singleton(){}
public statics synchronized Singleton getInstance(){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}
return uniqueInstace;
}
}
以上的问题是会消耗大量的资源(土豪的做法)
-急切实例化
public class Singleton(){
private static Singleton uniqueInstance = new Singleton();
private Singleton(){}
public statics Singleton getInstance(){
//if(uniqueInstance==null){
// uniqueInstance = new Singleton();
//
return uniqueInstace;
}
}
以上做法是那些总是创建并使用单例的程序,这个做法依赖jvm加载这个类时马上创建此唯一的单件实例,保证任何线程访问静态变量之前一定创建实例
双重检查加锁(s)
public class Singleton(){
private volatile static Singleton uniqueInstance;
private Singleton(){}
public statics Singleton getInstance(){
if(uniqueInstance==null){
synchronized(Singleton.class){
if(uniqueInstance==null){
uniqueInstance = new Singleton();
}
return uniqueInstace;
}
}
}
以上只有第一次才永不,双重加锁。减少时间的耗费。
ps:1.5以及以后的版本才支持
注意:很多情况下开发适合使用单例模式的情况下其实并不多
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- Spring框架中context-param与servlet中init-param的contextConfigLocation的区别
- Java流
- 1.1.4 计算机网络的分类
- 强力推荐给大家的资源:给程序员的设计学习指南
- UVA:11624 Fire!(双BFS+打表)
- java设计模式之单例模式
- 第一次使用zookeeper
- char* 与 烫烫烫烫烫
- C# Winform程序 使用登录窗体到主窗体 且传登录信息
- 基于spring-cloud实现eureka注册服务小案例
- Android Studio 使用Eclipse中的keystore为App签名
- 7/29 CodeForces Div2
- mysql 第九天
- 高效并发-Java内存模型和线程