通过ThreadLocal实现单例模式

最新学到一种新的实现单例的方式

import java.util.HashMap;
import java.util.Map;
public class AppContext {
    private static final ThreadLocal<AppContext> local = new ThreadLocal<>();
    private Map<String,Object> data = new HashMap<>();
    public Map<String, Object> getData() {
        return getAppContext().data;
    }
    //批量存数据
    public void setData(Map<String, Object> data) {
        getAppContext().data.putAll(data);
    }
    //存数据
    public void set(String key, String value) {
        getAppContext().data.put(key,value);
    }
    //取数据
    public void get(String key) {
        getAppContext().data.get(key);
    }
    //初始化的实现方法
    private static AppContext init(){
        AppContext context = new AppContext();
        local.set(context);
        return context;
    }
    //做延迟初始化
    public static AppContext getAppContext(){
        AppContext context = local.get();
        if (null == context) {
            context = init();
        }
        return context;
    }
    //删除实例
    public static void remove() {
        local.remove();
    }
}

在这里插入代码片

上面的代码实现实际上就是懒汉式初始化的扩展,只不过用 ThreadLocal 替换静态对象来存储唯一对象实例。之所会选择 ThreadLocal,就是因为 ThreadLocal 相比传统的线程同步机制更有优势。

在传统的同步机制中,我们通常会通过对象的锁机制来保证同一时间只有一个线程访问单例类。这时该类是多个线程共享的,我们都知道使用同步机制时,什么时候对类进行读写、什么时候锁定和释放对象是有很烦琐要求的,这对于一般的程序员来说,设计和编写难度相对较大。

而 ThreadLocal 则会为每一个线程提供一个独立的对象副本,从而解决了多个线程对数据的访问冲突的问题。正因为每一个线程都拥有自己的对象副本,也就省去了线程之间的同步操作。

所以说,现在绝大多数单例模式的实现基本上都是采用的 ThreadLocal 这一种实现方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值