package
cache;
import
java.lang.ref.Reference;
import
java.lang.ref.WeakReference;
import
java.util.Map;
import
java.util.WeakHashMap;
import
java.util.concurrent.locks.ReentrantReadWriteLock;
public
class
WeakCache<K, V> {
private
final
Map<K, Reference<V>> cache =
new
WeakHashMap<>();
private
final
ReentrantReadWriteLock lock =
new
ReentrantReadWriteLock();
public
void
put(K k, V v) {
lock.writeLock().lock();
try
{
if
(v !=
null
) {
cache.put(k,
new
WeakReference(v));
}
else
{
cache.remove(k);
}
}
finally
{
lock.writeLock().unlock();
}
}
public
V get(K k) {
lock.readLock().lock();
Reference<V> value = cache.get(k);
if
(value ==
null
) {
return
null
;
}
V v = value.get();
if
(v ==
null
) {
lock.readLock().unlock();
lock.writeLock().lock();
try
{
cache.remove(k);
}
finally
{
lock.writeLock().unlock();
}
}
else
{
lock.readLock().unlock();
}
return
v;
}
public
void
clear() {
lock.writeLock().lock();
try
{
this
.cache.clear();
}
finally
{
lock.writeLock().unlock();
}
}
}
相关推荐
在Java中,对象的引用方式对于内存管理和对象生命周期的控制至关重要。从JDK 1.2版本开始,Java引入了四种不同级别的引用:强引用(Strong Reference)、软...希望本文能够为您提供在Java引用类型的使用上清晰的指导
在Java编程语言中,引用类型是理解内存管理的关键概念之一。强引用、弱引用、软引用和虚引用是四种不同的引用强度,它们在垃圾回收机制中扮演着不同的角色。了解这些引用类型对于优化内存使用、防止内存泄漏以及合理...
### Java中的软引用、弱引用和虚引用详解 #### 一、引言 在Java开发过程中,特别是Android应用开发中,经常会遇到一个普遍的问题——内存溢出(OutOfMemory Error,简称OOM)。这个问题往往与如何有效地管理内存...
在 Java 中,引用可以分为四类:强引用、软引用、弱引用和虚引用(也称为精灵引用)。弱引用是其中的一种,它们允许垃圾回收器在某些情况下回收对象,而不是像强引用那样坚持对象的存在。 弱引用的工作原理是,当...
然而,为了更好地控制内存,Java提供了不同类型的引用:强引用、弱引用、软引用和虚引用。这些引用类型允许程序员在特定场景下干预垃圾收集过程,以达到更精细的内存管理。 1. **强引用(Strong Reference)** - *...
`put`方法将图片与对应的键一起存入缓存,而`getSoftReference`和`getWeakReference`方法分别根据键获取软引用或弱引用的对象。当需要清理缓存时,只需要清空这两个映射即可,因为软引用和弱引用的对象会在垃圾收集...
当对象不再被软引用引用时,Java虚拟机会将该软引用加入到引用队列中,以便程序可以检测到对象已经被回收。 示例代码: ```java String str = new String("hello"); SoftReference<String> softRef = new ...
从Java SE2开始,Java引入了四种不同类型的引用:强引用、软引用、弱引用和虚引用,它们各自具有不同的特点和用途,有助于程序员更精细地控制对象的生命周期,并优化垃圾回收过程。 1. 强引用(Strong Reference) ...
Java对象的引用类型是Java内存管理中的重要概念,特别是在JDK 1.2及后续版本中引入了四种级别的引用:强引用、软引用、弱引用和虚引用,以提供更精细的控制对象生命周期的能力。 1. **强引用(StrongReference)**: ...
当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象之前,把这个虚引用加入到与之关联的队列中。程序可以通过检查这个队列,获取到虚引用的信息,并采取相应的行动。 #### 六、总结 综上所述,...
软引用可以和一个引用队列(`ReferenceQueue`)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java 虚拟机就会把这个软引用加入到与之关联的引用队列中。这使得我们可以在对象被回收时,得到通知,进行相应的...
### Java中对象与引用 在Java编程中,深入理解对象与引用的概念对于掌握面向对象编程至关...理解对象与引用的关系是Java编程的基础,也是掌握面向对象编程的关键之一。希望本文能够帮助读者更好地理解和应用这些概念。
从JDK 1.2版本开始,Java引入了一种更为精细的引用类型管理机制,通过四种不同的引用类型:强引用、软引用、弱引用和虚引用,让开发者能够更加灵活地控制对象的生命周期。这种机制不仅提升了Java应用程序对内存使用...
"JAVA 弱引用详解" JAVA 弱引用是JAVA语言中的一种特殊的引用类型,它使用WeakReference类来实现。弱引用是一种非必需对象的描述,它比软引用更弱。在发生GC时,只要发现弱引用,不管系统堆空间是否足够,都会将...
本文将深入探讨强引用、软引用、弱引用以及幻象引用这四种引用类型,以及它们与垃圾收集的关系。 1. **强引用(Strong Reference)**: - 强引用是Java中最常见的引用类型,它代表了一个对象的直接访问路径。只要...
本示例“java引用的demo”将深入探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型对于理解和优化内存管理至关重要,特别是在Android开发中,因为良好的内存管理能够提升应用性能并防止内存...
强引用、弱引用、软引用和虚引用这四种引用类型提供了不同的对象生命周期管理策略。下面将详细介绍这些引用的区别及其应用场景。 1. **强引用(Strong Reference)** - 强引用是最常见的引用类型,如普通变量引用。...
这个"referenceInJava"项目专注于探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型与垃圾收集(Garbage Collection, GC)机制密切相关,对于优化内存使用和防止内存泄漏至关重要。 1. **强...
只要对象通过强引用与任何可达变量关联,就不会被垃圾收集器回收。例如: ```java String str = new String("Hello"); ``` - 当强引用导致内存泄漏时,如在缓存中存储大量对象,必须手动判断并移除不再需要的...
Java中的引用问题主要涉及到对象作为参数传递时的行为。在Java中,有两类数据类型:基本类型(如int、char)和引用类型(如类实例、数组)。对于基本类型,Java采用值传递的方式,而对于引用类型,则是传递引用的...