设计模式
来源:互联网 发布:网络性能测试包括什么 编辑:程序博客网 时间:2024/06/14 02:22
定义:确保一个类只有一个实例,并提供一个全局访问点。
View Code
View Code
View Code
View Code
View Code
一、线程不安全的
1、饱汉式,只有在被第一次调用的时候才创建实例。
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.singleton;public class Singleton { // 利用静态变量创建唯一实例 private static Singleton instance; // 构造器定义为私有的,防止外部创建对象 private Singleton(){ } // 获取实例 public static Singleton getInstance() { if(null == instance){ instance = new Singleton(); } return instance; }}
二、线程安全的
1、饿汉式,类加载时就创建实例。
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.singleton;public class Singleton { // 利用静态变量创建唯一实例 private static Singleton instance = new Singleton(); // 构造器定义为私有的,防止外部创建对象 private Singleton(){ } // 获取实例 public static Singleton getInstance() { return instance; }}
2、和饱汉式很像,只是加了个关键字synchronized使其变成线程安全的,但是如果是频繁创建实例,那就会降低性能。
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.singleton;public class Singleton { // 利用静态变量创建唯一实例 private static Singleton instance; // 构造器定义为私有的,防止外部创建对象 private Singleton(){ } // 获取实例,使用synchronized关键字使获取实例为线程安全的 public static synchronized Singleton getInstance() { if(null == instance){ instance = new Singleton(); } return instance; }}
3、双重检查加锁,先检查实例是否为空后才进行同步处理,同步块的代码只执行一次。
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.singleton;public class Singleton { // 利用静态变量创建唯一实例 private static volatile Singleton instance; // 构造器定义为私有的,防止外部创建对象 private Singleton(){ } // 获取实例,使用synchronized关键字在类上使获取实例为线程安全的 public static Singleton getInstance() { if(null == instance){ synchronized (Singleton.class) { if(null == instance){ instance = new Singleton(); } } } return instance; }}
4、静态内部类方式创建实例。
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
package com.singleton;public class Singleton { // 构造器定义为私有的,防止外部创建对象 private Singleton(){ } // 获取实例 public static Singleton getInstance() { return LazyHolder.instance; } // 静态内部类 private static class LazyHolder { private static final Singleton instance = new Singleton(); } }
三、总结
1、饿汉和饱汉式的区别就是实例加载的时间不同,饿汉实例随类加载而创建,饱汉是调用时创建实例。
2、单例模式有线程安全和不安全之分,注意恰当使用。
阅读全文
0 0
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式~~~~~~~~~~
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- 设计模式
- LinkedList源码浅析(jdk1.8)
- nodejs常用命令
- JSP简介
- HashMap源码浅析(jdk1.8)
- 大数据多路并归算法
- 设计模式
- EasyNVR H5直播流媒体解决方案前端构建之:如何播放自动适配RTMP/HLS直播播放
- java中next(),nextInt()和nextLine()
- 将博客搬至CSDN
- 设计模式
- 设计模式
- ScrollView实现悬浮标题栏效果
- 基于springmvc的hessian调用原理浅析
- Eclipse远程Debug