java设计模式一:单例模式

    • 什么是单例模式:

对象在一个进程中有且只有一个实例,并提供一个访问它的全局访问点。

    • 代码实例1:

    package com.caocl.designmode.singletonMode;
    
    /**
     * 饿汉式
     * 类加载到内存后,就实例化一个单例,jvm保证线程安全
     * 简单实用,推荐使用
     * 缺点:不管用到与否,类加载时都会完成实例化
     */
    public class One {

        private static final One INSTANCE = new One();
    
        private One() {}

        public static One getInstance() {return INSTANCE;}

    }
    • 代码实例2:

package com.caocl.designmode.singletonMode;

public class Two {

    private static final Two INSTANCE;

    static {
        INSTANCE = new Two();
    }

    private Two(){}

    public static Two getInstance() {
        return INSTANCE;
    }
    
}
    • 代码实例3:

package com.caocl.designmode.singletonMode;

/**
 * lazy loading
 * 也称懒汉式
 * 虽然做到了按需初始化的目的,但却带来了线程不安全的问题
 */
public class Three {

    private static Three INSTANCE;

    private Three() {}

    public static Three getInstance() {
        if (INSTANCE == null) {
            return new Three();
        }
        return INSTANCE;
    }
}
    • 代码实例4:

package com.caocl.designmode.singletonMode;

/**
 * lazy loading
 * 也称懒汉式
 * 虽然做到了按需初始化的目的,但却带来了线程不安全的问题
 * 可以通过synchronized加锁解决,但是会降低效率
 */
public class Four {

    private static Four INSTANCE;

    private Four() {}

    public static synchronized Four getInstance() {
        if (INSTANCE == null) {
            return new Four();
        }
        return INSTANCE;
    }
}
    • 代码实例5:

package com.caocl.designmode.singletonMode;

/**
 * lazy loading
 * 也称懒汉式
 * 虽然做到了按需初始化的目的,但却带来了线程不安全的问题
 * 可以通过synchronized加锁解决,但是会降低效率
 * 将锁方法改为锁代码块的方式,试图解决降低效率的弊端
 * 但是又导致了线程不安全的弊端
 */
public class Five {

    private static Five INSTANCE;

    private Five() {}

    public static Five getInstance() {
        if (INSTANCE == null) {
            synchronized (Five.class) {
                return new Five();
            }
        }
        return INSTANCE;
    }
}
    • 代码实例6:

package com.caocl.designmode.singletonMode;

/**
 * lazy loading
 * 也称懒汉式
 * 虽然做到了按需初始化的目的,但却带来了线程不安全的问题
 * 可以通过synchronized加锁解决,但是会降低效率
 * 将锁方法改为锁代码块的方式,试图解决降低效率的弊端
 * 但是又导致了线程不安全的弊端
 * 为了解决这个问题,提出了双重判断的机制
 */
public class Six {

    private static volatile Six INSTANCE;

    private Six() {}

    public static Six getInstance() {
        if (INSTANCE == null) {
            synchronized (Six.class) {
                if (INSTANCE == null) {
                    return new Six();
                }
            }
        }
        return INSTANCE;
    }
}
    • 代码实例7:

package com.caocl.designmode.singletonMode;

/**
 * 静态内部类方式
 * JVM保证单例
 * 加载外部类时不会加载内部类,这样可以实现懒加载
 */
public class Seven {
    private Seven () {}

    private static class SevenHolder {
        private final static Seven INSTANCE = new Seven();
    }

    public static Seven getInstance() {
        return SevenHolder.INSTANCE;
    }
}
    • 代码实例8: 最优雅最完美的设计

package com.caocl.designmode.singletonMode;

/**
 * 不仅可以解决线程同步,还可以防止反序列化
 */
public enum Eight {

    INSTANCE;

    public void m() {
        // 业务代码
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值