Java ConcurrentHashMap 设置过期时间:实现缓存功能
Java ConcurrentHashMap 不直接支持设置过期时间,因为它是一个线程安全的哈希表,而不是一个缓存。但是,您可以通过扩展 ConcurrentHashMap 类,并在其中添加过期时间的逻辑来实现该功能。\n\n以下是一个示例实现:\n\njava\nimport java.util.concurrent.ConcurrentHashMap;\n\npublic class ExpiringConcurrentHashMap<K, V> extends ConcurrentHashMap<K, ExpiringObject<V>> {\n\n private static final long DEFAULT_EXPIRATION_TIME = 60 * 1000; // 默认过期时间为60秒\n\n public ExpiringConcurrentHashMap() {\n super();\n }\n\n public ExpiringConcurrentHashMap(int initialCapacity) {\n super(initialCapacity);\n }\n\n public V put(K key, V value, long expirationTime) {\n ExpiringObject<V> expiringObject = new ExpiringObject<>(value, expirationTime);\n ExpiringObject<V> previousValue = super.put(key, expiringObject);\n return previousValue != null ? previousValue.getValue() : null;\n }\n\n public V get(Object key) {\n ExpiringObject<V> expiringObject = super.get(key);\n if (expiringObject != null && !expiringObject.isExpired()) {\n return expiringObject.getValue();\n }\n return null;\n }\n\n private static class ExpiringObject<V> {\n\n private final V value;\n private final long expirationTime;\n\n public ExpiringObject(V value, long expirationTime) {\n this.value = value;\n this.expirationTime = System.currentTimeMillis() + expirationTime;\n }\n\n public V getValue() {\n return value;\n }\n\n public boolean isExpired() {\n return System.currentTimeMillis() > expirationTime;\n }\n }\n}\n\n\n在这个例子中,我们扩展了 ConcurrentHashMap 类,并添加了一个内部类 ExpiringObject 来存储值和过期时间。put() 方法接受一个额外的参数 expirationTime,用于设置键值对的过期时间。get() 方法会检查键值对是否过期,并返回对应的值。\n\n使用示例:\n\njava\nExpiringConcurrentHashMap<String, Object> cache = new ExpiringConcurrentHashMap<>();\ncache.put("key1", "value1", 5000); // 设置键值对的过期时间为5秒\n\nObject value = cache.get("key1"); // 获取键值对的值\nSystem.out.println(value); // 输出 "value1"\n\nThread.sleep(6000); // 等待6秒,使得键值对过期\n\nvalue = cache.get("key1"); // 再次获取键值对的值\nSystem.out.println(value); // 输出 "null",键值对已过期\n\n\n请注意,在这个例子中,过期时间是以毫秒为单位的。您可以根据自己的需求调整过期时间的单位和默认值。
原文地址: https://www.cveoy.top/t/topic/pwD7 著作权归作者所有。请勿转载和采集!