单例模式的探索

单例模式的探索

单例模式时java中一个相当重要的设计模式,对于一个类,只能存在一个实例。比如在缓存中,全局的缓存应该是单一并且一致的。这里给出常见的单例模式的实现,并做了改进,使之成为线程安全的单例

饿汉式

​ 在使用对象的时候已经加载完毕,常见的就是直接使用new关键字

public class Resource {
    private static Object source = new Object();

    private Resource() {

    }

    public static Object get() {
        /**
         * 使用类的时候 source对象已经加载完毕
         * 他就是线程安全的,没有特殊情况
         * 线程安全!
         */
        return source;
    }
}

懒汉式

​ 懒汉式是指在getInstance()的时候创建实例,从代码实现中探究线程安全性吧

public class Resource {

    private Object source;

    private Resource() {
    }

    public Object getInstance() {
        if (source == null) {
            source = new Object();
        }
        return source;
    }
}

​ 两个线程同时调用getInstance()方法,他们同时发现source是空的,继而分别创建了object,解决方案很简单,在方法前加synchronized关键字,静态方法加锁会锁整个类,小了说,会锁住整个方法体,下面介绍一下DCL(Double Check Lock)机制

import java.util.concurrent.TimeUnit;

public class Resource {

    private Object source;

    private Resource() {
    }

    public Object getInstance() {

        if (source == null) {
            // 模拟对象构建所用的时间
            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (Resource.class) {
                if (source == null)
                    source = new Object();
            }
        }

        return source;
    }
}

​ 如果对象是空的拿锁,拿到锁后检查一下对象是不是空的,如果不是空的就不需要操作了

静态内部类

​ 感觉和饿汉式差不多

public class Resource {

    private Object source;

    private Resource() {
        source = new Object();
    }

    private static class SourceHandler {
        private static Resource resource = new Resource();
    }

    public Object getInstance() {
        return SourceHandler.resource;
    }
}

​ 未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值