java 单例模式
来源:互联网 发布:fm2016经典球星数据库 编辑:程序博客网 时间:2024/06/16 07:45
单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。
(Servlet类被设计成单例,被所有线程共享!)
单例模式的好处有三点:
1:控制实例产生的数量,达到节约资源的目的,有利于java垃圾回收
2:控制资源的使用,通过线程的同步来控制资源的并发访问
3:作为通信的媒介,也就是数据共享,他可以在不建立直接关联的情况下,让多个不想关的线程或进程之间实现通信
单例模式的特点是:
1、单例类只有一个实例
2、单例类必须自己创建自己的唯一实例
3、单例类必须给所有其他对象提供这一实例
缓存、日志、创建比较耗时的往往可以设计成单例
单例模式的集中比较常见的实现方式:
1:懒汉式单例:
优点 实现了延迟加载
但在多线程的环境下如果不同步getInstance方法会有线程安全问题,如果同步getInstance方法
编程串行执行 降低效率
只有在第一次调用方法时才需要同步。由于只有第一次调用执行了new LazySingleTon();而只有此行代码需要同步,因此就无需对后续调用使用同步。所有其他调用仅判断instance是非null的,并将其返回。多线程能够安全并发地执行除第一次调用外的所有调用。尽管如此,由于该方法是 synchronized的,需要为该方法的每一次调用付出同步的代价,
/**
* 懒汉式
* 构造器私有化 :子类就不能调用父类的构造器 子类就不能声明新对象
* 提供私有的静态属性 :只能本类自己用 切实静态的 只在加载时初始化有且仅有一次
* 提供公共静态的方法 :可以通过类名调用 获得实例对象
* @author ren
*
*/
public class LazySingleTon {
private static LazySingleTon lazySingleTon=null;
private LazySingleTon() {
}
public static synchronized LazySingleTon getInstance(){
if(lazySingleTon==null){
lazySingleTon= new LazySingleTon();
}
return lazySingleTon;
}
}
2:饿汉式单例 优点是 线程安全 缺点是 没有达到延迟加载(lazy loading)的效果
public class EagerSingleTon {
private static EagerSingleTon eagerSingleTon=new EagerSingleTon();
private EagerSingleTon() {
}
public static EagerSingleTon getInstance(){
return eagerSingleTon;
}
}
3、双检查机制 优点 在多线程的情况下相对提高了效率 且不会生成两个对象
*/
class Single{
private static Single single;
private Single(){
}
//double checking 双检查机制 提高效率
public static Single getInstance(){
if(null==single){
//第一次
synchronized(Single.class){
if (null == single) {
single = new Single();
}
return single;
}
}else{
return single;
}
}
}
4、静态内部类方式
使用静态内部类 jvm在加载SingleTon_StaticInnerClass时,并不加载它的内部类InnerSingleTon
而是在调用getInstance方法时 调用InnerSingleTon才加载内部类,从而调用SingleTon_StaticInnerClass的构造方法
实例化SingleTon_StaticInnerClass 从而在不需要同步的情况下实现延时初始化的效果
public class SingleTon{
private SingleTon(){
}
static class InnerSingleTon{
static SingleTon instance=new SingleTon();
}
public static SingleTon getInstance(){
return InnerSingleTon.instance;
}
}
5、枚举方式 很少有人用
SessionFactory 是单例的 Session不是单例的
(Servlet类被设计成单例,被所有线程共享!)
单例模式的好处有三点:
1:控制实例产生的数量,达到节约资源的目的,有利于java垃圾回收
2:控制资源的使用,通过线程的同步来控制资源的并发访问
3:作为通信的媒介,也就是数据共享,他可以在不建立直接关联的情况下,让多个不想关的线程或进程之间实现通信
单例模式的特点是:
1、单例类只有一个实例
2、单例类必须自己创建自己的唯一实例
3、单例类必须给所有其他对象提供这一实例
缓存、日志、创建比较耗时的往往可以设计成单例
单例模式的集中比较常见的实现方式:
1:懒汉式单例:
优点 实现了延迟加载
但在多线程的环境下如果不同步getInstance方法会有线程安全问题,如果同步getInstance方法
编程串行执行 降低效率
只有在第一次调用方法时才需要同步。由于只有第一次调用执行了new LazySingleTon();而只有此行代码需要同步,因此就无需对后续调用使用同步。所有其他调用仅判断instance是非null的,并将其返回。多线程能够安全并发地执行除第一次调用外的所有调用。尽管如此,由于该方法是 synchronized的,需要为该方法的每一次调用付出同步的代价,
/**
* 懒汉式
* 构造器私有化 :子类就不能调用父类的构造器 子类就不能声明新对象
* 提供私有的静态属性 :只能本类自己用 切实静态的 只在加载时初始化有且仅有一次
* 提供公共静态的方法 :可以通过类名调用 获得实例对象
* @author ren
*
*/
public class LazySingleTon {
private static LazySingleTon lazySingleTon=null;
private LazySingleTon() {
}
public static synchronized LazySingleTon getInstance(){
if(lazySingleTon==null){
lazySingleTon= new LazySingleTon();
}
return lazySingleTon;
}
}
2:饿汉式单例 优点是 线程安全 缺点是 没有达到延迟加载(lazy loading)的效果
public class EagerSingleTon {
private static EagerSingleTon eagerSingleTon=new EagerSingleTon();
private EagerSingleTon() {
}
public static EagerSingleTon getInstance(){
return eagerSingleTon;
}
}
3、双检查机制 优点 在多线程的情况下相对提高了效率 且不会生成两个对象
*/
class Single{
private static Single single;
private Single(){
}
//double checking 双检查机制 提高效率
public static Single getInstance(){
if(null==single){
//第一次
synchronized(Single.class){
if (null == single) {
single = new Single();
}
return single;
}
}else{
return single;
}
}
}
4、静态内部类方式
使用静态内部类 jvm在加载SingleTon_StaticInnerClass时,并不加载它的内部类InnerSingleTon
而是在调用getInstance方法时 调用InnerSingleTon才加载内部类,从而调用SingleTon_StaticInnerClass的构造方法
实例化SingleTon_StaticInnerClass 从而在不需要同步的情况下实现延时初始化的效果
public class SingleTon{
private SingleTon(){
}
static class InnerSingleTon{
static SingleTon instance=new SingleTon();
}
public static SingleTon getInstance(){
return InnerSingleTon.instance;
}
}
5、枚举方式 很少有人用
SessionFactory 是单例的 Session不是单例的
0 0
- java单例模式
- Java单例模式
- java单例模式
- java单例模式
- Java单例模式
- Java单例模式
- java单例模式
- Java单例模式
- java 单例模式
- java单例模式
- java单例模式
- java单例模式
- java 单例模式
- JAVA单例模式
- java单例模式 .
- Java 单例模式
- Java单例模式
- Java 单例模式
- maven安装配置JAVA_HOME环境变量
- 关闭liunx防火墙
- CNN toolbox
- Instagram技术窥探,助你打造响应式App
- 数据库——视图
- java 单例模式
- HDU 1026 Ignatius and the Princess I - BFS + 优先队列
- doublelinlist
- TQ2440——通过nfs挂载根文件系统
- ios中关于delegate(委托)的使用心得
- java 代理模式
- POJ 2777 线段树
- 请求转发和重定向
- 重构版机房收费系统构建思路