问题
在客户端中心化服务(单例)中,可能会多次进行同一个耗时服务,比如说和服务端同步状态。在进行同步时,如果有请求进来,理论上是不需要真正执行的,仅需要等待正在进行的请求。
解决
其实是一个时序的问题,如果请求发起比获得结果要早,就可以直接使用结果。
那么,中心服务中使用ThreadLocal存储一下发起请求的时机,进入一个锁住的同步过程,同步过程后更新结果和结果时间即可。
ThreadLocal的释放问题
代码
public class Work {
private static Work sInstance = new Work();
public static Work getInstance() {
return sInstance;
}
private ThreadLocal<Long> mRequestTime = new ThreadLocal<>();
private int mResult;
private long mResultTime;
public void doWork() {
mRequestTime.set(SystemClock.uptimeMillis());
realDo();
}
private synchronized void realDo() {
if (mRequestTime.get() < mResultTime) {
return;
}
try {
Thread.sleep(new Random(System.currentTimeMillis()).nextInt(250));
} catch (InterruptedException e) {
e.printStackTrace();
}
mResult = new Random(System.currentTimeMillis()).nextInt();
mResultTime = SystemClock.uptimeMillis();
}
}