您的位置:首页 > 其它

一种中心服务中同步状态的方法

2016-06-14 17:08 381 查看

问题

在客户端中心化服务(单例)中,可能会多次进行同一个耗时服务,比如说和服务端同步状态。在进行同步时,如果有请求进来,理论上是不需要真正执行的,仅需要等待正在进行的请求。

解决

其实是一个时序的问题,如果请求发起比获得结果要早,就可以直接使用结果。

那么,中心服务中使用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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: