过期单例hashmap

本文介绍了一个使用Java编写的ExpireHashMap,它实现了缓存的生存时间管理和过期判断。核心功能包括记录每个entry的到期时间、检查entry是否过期以及put和get操作。通过实例演示了如何使用和缓存的更新机制。
摘要由CSDN通过智能技术生成

package com.myfun.houseWeb.house.szhk;

/**

  • @description: expire hashmap
  • @author: Aprilz
  • @since: 2022/10/21
    **/
    import java.math.BigDecimal;
    import java.util.Date;
    import java.util.HashMap;

public class ExpireHashMap<K, V> extends HashMap<K, V> {

private static volatile  ExpireHashMap instance = null;

private ExpireHashMap() {
}

public static ExpireHashMap getInstance() {
    if(instance == null) {
        synchronized (ExpireHashMap.class) //b
        {
            if(instance == null) {
                instance = new ExpireHashMap();
            }
        }
    }
    return instance;
}



/**
 * 记录每个entry的到期时间
 */
private HashMap<K, Date> expireMap = new HashMap<K, Date>();

/**
 * 判断entry是否到期
 */
private boolean isExpire(K key) {
    if (!super.containsKey(key)) return true;

    Date expireDate = this.expireMap.get(key);
    return DateUtil.now().after(expireDate);
}

/**
 * 存
 *
 * @param survivalTime 该entry的存活时间,单位毫秒
 */
public V put(K key, V value, Long survivalTime) {
    this.expireMap.put(key, DateUtil.afterDate(DateUtil.now(), survivalTime));
    return super.put(key, value);
}

/**
 * 取
 */
@Override
public V get(Object key) {
    K k = (K) key;
    if (isExpire(k)) return null;
    return super.get(key);
}

@Override
public boolean containsKey(Object key) {
    K k = (K) key;
    if (isExpire(k)) return false;
    return super.containsKey(key);
}


private static class DateUtil {
    private static Date now() {
        return new Date();
    }

    /**
     * date后ms毫秒的时间
     *
     * @param ms 毫秒数
     */
    private static Date afterDate(Date date, Long ms) {
        return new Date(date.getTime() + ms);
    }
}

/**
 * 测试
 */
public static void main(String[] args) throws Exception {
    ExpireHashMap instance = ExpireHashMap.getInstance();
    ExpireHashMap instance2 = ExpireHashMap.getInstance();
    instance.put("name", new BigDecimal("100"), 1000L);
    instance2.put("value", new BigDecimal("200"), 3000L);
    System.out.println(instance == instance2);
    System.out.println(instance.get("name"));
    System.out.println(instance.get("value"));
    Thread.sleep(2000);
    System.out.println(instance.get("name"));
    System.out.println(instance2.get("name"));
    System.out.println(instance.get("value"));
    System.out.println(instance2.get("value"));
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值