java time out_java带timeout的本地缓存实现

最近碰到了本地缓存,查阅了一下资料使用currentHashMap实现了一个带timeout的本地缓存,

直接上代码:

package local.cache;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

public class LocalCache {

private LocalCache() {

}

// 测试为public,实际使用应该改为private

public static final Map localCache = new ConcurrentHashMap();

static {

// 初始化

// Test

for(int i = 1;i<11;i++) {

System.out.println(LocalCache.set(String.valueOf(i),i +"-value", 3000));

}

}

private static class ValueObject {

private String value;

private long timeout;

private ValueObject(String value, long timeout) {

super();

this.value = value;

this.timeout = timeout;

}

private String getValue() {

return value;

}

private long getTimeout() {

return timeout;

}

}

public static String set(String key, String value, long timeout) {

long currentTime = System.currentTimeMillis();

ValueObject valueObject = localCache.get(key);

if (localCache.keySet().contains(key) && (valueObject.getTimeout() == 0 ||currentTime <= valueObject.getTimeout())) {

return valueObject.getValue();

} else {

ValueObject oldValueObject = localCache.put(key,new ValueObject(value,currentTime + timeout));

return oldValueObject == null ? null : oldValueObject.getValue();

}

}

public static String set(String key, String value) {

ValueObject oldValueObject = localCache.put(key,new ValueObject(value, 0));

return oldValueObject == null ? null : oldValueObject.getValue();

}

public static String get(String key) {

long currentTime = System.currentTimeMillis();

ValueObject valueObject = localCache.get(key);

if (valueObject == null) {

return null;

}

if (valueObject.getTimeout() == 0 || currentTime <= valueObject.getTimeout()) {

return valueObject.getValue().toString();

} else {

localCache.remove(key);

return null;

}

}

}

测试:

package local.cache;

public class Client {

public static void main(String[] args) {

System.out.println(LocalCache.localCache);//为了使static(field,block,method) 运行(初始化),初始化顺序为代码声明的顺序

// 实际使用时只有LocalCache.set和LocalCache.get暴露出来,所以调用这两个方法的时候,localCache和静态块已经先行初始化了

try {

Thread.sleep(3001);// 本来使用的是3000,但是输出有问题,有些预想已经过时的却仍旧能够取得到,估计是jvm运行优化导致的

} catch (InterruptedException e) {

e.printStackTrace();

}

for(int i = 1;i < 11;i++) {

System.out.println(i +":"+ LocalCache.get(String.valueOf(i)));

}

}

}

currentHashMap这个实现类在多线程情况下,有一个类似行级读写锁功能,可以另行查阅一下。

所以这个也就实现了并发的安全性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值