移动架构08_单例模式
2017-10-01 17:03
429 查看
Demo:http://download.csdn.net/download/baopengjian/10005006
一、饿汉模式:
第一步加载class文件就已经实例化了
缺点:没有做到想用时才实例化
public class SingleEasy {
private static SingleEasy singleEasy = new SingleEasy();
public static SingleEasy getInstance(){
return singleEasy;
}
}
二、懒汉模式:
每次调用getInstance时 都需要进行同步开销
public class SingleNotEmptyEasy {
private static SingleNotEmptyEasy iEasy;
public static synchronized SingleNotEmptyEasy getInstance(){
if(iEasy == null){
iEasy = new SingleNotEmptyEasy();
}
return iEasy;
}
}
三、DCL单例模式:
缺点:高并发时,也会产生创建不止一个对象。
原因:class文件中方法的字节码流就是由JVM的指令序列构成的
Jdk5 以后支持处理器乱序执行 汇编指令
导致 指向地址和实例化堆区 顺序不同
public class DCLSingle {
private static DCLSingle single;
public DCLSingle getInstance(){
if(single == null){
synchronized (DCLSingle.class) {
if(single == null){
single = new DCLSingle();
}
}
}
return single;
}
四、枚举:
public enum EnumManger {
SDCardManager(10)
{
@Override
public EnumManger getSingle() {
return SDCardManager;
}
}
,
HttpManager(1) {
@Override
public EnumManger getSingle() {
return HttpManager;
}
};
private int type;
public abstract EnumManger getSingle();
private EnumManger(int type)
{
this.type = type;
}
}
注意:
1 枚举中的属性必须放在最前面
2. 枚举中可以和java类一样定义方法
3. 枚举中的构造方法必须是私有的
五、登记式/静态内部类
是否多线程安全:是
描述:这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
代码实例:
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
一、饿汉模式:
第一步加载class文件就已经实例化了
缺点:没有做到想用时才实例化
public class SingleEasy {
private static SingleEasy singleEasy = new SingleEasy();
public static SingleEasy getInstance(){
return singleEasy;
}
}
二、懒汉模式:
每次调用getInstance时 都需要进行同步开销
public class SingleNotEmptyEasy {
private static SingleNotEmptyEasy iEasy;
public static synchronized SingleNotEmptyEasy getInstance(){
if(iEasy == null){
iEasy = new SingleNotEmptyEasy();
}
return iEasy;
}
}
三、DCL单例模式:
缺点:高并发时,也会产生创建不止一个对象。
原因:class文件中方法的字节码流就是由JVM的指令序列构成的
Jdk5 以后支持处理器乱序执行 汇编指令
导致 指向地址和实例化堆区 顺序不同
public class DCLSingle {
private static DCLSingle single;
public DCLSingle getInstance(){
if(single == null){
synchronized (DCLSingle.class) {
if(single == null){
single = new DCLSingle();
}
}
}
return single;
}
四、枚举:
public enum EnumManger {
SDCardManager(10)
{
@Override
public EnumManger getSingle() {
return SDCardManager;
}
}
,
HttpManager(1) {
@Override
public EnumManger getSingle() {
return HttpManager;
}
};
private int type;
public abstract EnumManger getSingle();
private EnumManger(int type)
{
this.type = type;
}
}
注意:
1 枚举中的属性必须放在最前面
2. 枚举中可以和java类一样定义方法
3. 枚举中的构造方法必须是私有的
五、登记式/静态内部类
是否多线程安全:是
描述:这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
代码实例:
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
相关文章推荐
- 移动架构20_策略模式
- 移动架构11_建造者模式
- 移动架构19_状态模式
- 移动架构14_命令模式
- 移动架构25_设计模式六大原则三:接口隔离原则
- 移动架构31_责任链和模板模式封装连续请求
- 移动架构15_解释器模式
- 移动架构26_设计模式六大原则四:依赖倒置原则
- 移动架构07_原型模式
- 移动架构27_设计模式六大原则五: 迪米特法则
- 移动架构04_设计模式一:工厂模式
- 移动架构06_设计模式二:抽象工厂模式
- 移动架构16_模板模式
- 移动架构24_设计模式六大原则二:里氏替换原则
- 移动架构28_设计模式六大原则六: 开闭原则
- 移动架构17_观察者模式
- 移动架构23_设计模式六大原则一:单一职责原则
- 重温经典之《企业应用架构模式》——.NET中的架构模式运用 (Base Patterns 1)
- 架构设计:生产者/消费者模式[2]:队列缓冲区
- Web开发框架中的架构模式比较(一)