java设计模式系列之《一》----- 单例模式

单例模式-----饿汉模式(执行效率高但是会有资源的浪费,因为只在启动时创建实例,所以不存在线程安全问题)

/**
 * 功能描述: 单例模式-----饿汉模式(执行效率高但是会有资源的浪费,因为只在启动时创建实例,所以不存在线程安全问题)
 * @date: 2019/8/6
 */
public class Order {

    //JVM保证类的静态成员只能被加载一次
    public static Order order = new Order();

    private Order() {
    }

    public static Order getInstance() {
        return order;
    }
}



单例模式-----懒汉模式(线程安全但是效率会有影响,推荐DCL)

/**
 * 功能描述: 单例模式-----懒汉模式(线程安全但是效率会有影响,推荐DCL)
 * @date: 2019/8/6
 */
public class OrderLazy {

    public static OrderLazy orderLazy;

    private OrderLazy() {};


    //写法有问题,一直new对象肯定不是单例的
//    public static OrderLazy getInstance() {
//        if(null == orderLazy) {
//            return new OrderLazy();
//        }
//        else return orderLazy;
//    }


    //--------加锁,线程安全但是效率会有影响
//    public static synchronized OrderLazy getInstance() {
//        if (null == orderLazy) {
//            orderLazy = new OrderLazy();
//        }
//        return orderLazy;
//    }

    //DCL双重检查锁的机制,第一个判断排除了已经有实例的情况,但是多线程环境下
    //若当前没有OrderLazy实例,则可能有多个线程进入第一个if判断
    //此时加锁,第一个线程进入会创建OrderLazy实例,但是一同进来的第一层if条件下的
    //其他线程也会创建新的实例,所以才会有第二层if,保证只有一个线程创建了OrderLazy实例
    public static OrderLazy getInstance() {//----------------多线程环境下的懒汉单例模式推荐
        if(null == orderLazy) {
            synchronized (OrderLazy.class) {
                if(null == orderLazy) {
                    orderLazy = new OrderLazy();
                }
            }
        }
        return orderLazy;
    }
}



单例模式-----静态内部类(推荐,线程安全,不浪费空间)

/**
 * 功能描述: 单例模式-----静态内部类(推荐,线程安全,不浪费空间)
 * @date: 2019/8/6
 */
public class OrderStatic {

    private OrderStatic () {};

    //懒加载--类加载时,其内部类不会同时被加载,只有在其静态成员被调用才会发生
    public static class OrderStaticSon {
        //线程安全--JVM保证了类的静态成员只会加载一次
        public static OrderStatic orderStatic = new OrderStatic();
    }

    public static OrderStatic getInstance() {
        return OrderStaticSon.orderStatic;
    }

}

 

 

单例模式测试类

**
 * 功能描述: 单例模式测试类
 * @date: 2019/8/6
 */
public class OrderTest {

    public static void main(String[] args) {

        ThreadOrder[] ThreadArr = new ThreadOrder[10];
        for (int i = 0; i < ThreadArr.length; i++) {
            ThreadArr[i] = new ThreadOrder();
            ThreadArr[i].start();
        }
    }

}

// 测试线程--十个线程测试,通过对象的hashcode是否相同判断是单例还是多例
class ThreadOrder extends Thread {
    @Override
    public void run() {
        System.out.println(OrderStatic.getInstance().hashCode());
    }
}

项目中最佳实践一般是配置类的单例,如:RedisConfig,AlipayConfig

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值