public abstract class CacheComputable<K,V>
extends java.lang.Object
| 限定符和类型 | 字段和说明 |
|---|---|
protected java.util.concurrent.ConcurrentHashMap<K,java.util.concurrent.Future<V>> |
cache |
| 构造器和说明 |
|---|
CacheComputable() |
| 限定符和类型 | 方法和说明 |
|---|---|
abstract V |
compute(K k) |
V |
run(K k)
这里通过调用ConcurrentHashMap::putIfAbsent方法
假设两个线程传入了同样的参数,并且都创建了一个FutureTask对象,
一个线程获得了cache的执行权限执行了cache::putIfAbsent()方法,并且返回了一个null到局部变量f中,
此时另一个线程也会调用cache::putIfAbsent()方法,由于第一个线程已经将相关键值对存入到cache中了,
那么第二个线程将获得第一个线程创建的FutureTask对象,并且将其替换给当前线程中的局部变量f,并且其判断f不为null,那么其会调用f::get()方法,
而此时第一个线程正在执行FutureTask::run方法,如果其已经计算完成,那么其会返回结果给第一个线程,而第二个线程是直接执行的FutureTask::get方法,
如果第一个线程执行完成,那么第二个线程将直接获取结果返回,如果第一个线程没有执行完成,那么第二个线程将等待第一个线程执行完成后再返回结果。
|
public V run(K k)
k -