我有一個提供REST API的簡單服務,我希望在服務中有一個後臺線程,它定期從遠程服務中檢索一些數據並將數據更新到一個對象,這個對象也被請求使用。 而我的問題是什麼是在服務器端點這種背景更新的最佳做法?在服務器端有後臺線程定期更新請求使用的一些數據的最佳做法?
爲了獲得最好的併發性,我最初的想法是簡單地在對象上使用volatile
,並在後臺線程中重置此指針,以便所有請求都可以在更新後看到它,並且可以請求查看快照該對象的舊版本。這個實現有什麼缺點嗎? ReaderWriterLock似乎是另一種選擇,但對此太重了?
class Service
{
public volatile String data = "default";
public void handleRequest(Request req, Response resp)
{
resp.setBody(data);
}
}
class Background implements Runnable
{
private Service serv;
// ...
public void run()
{
serv.data = "reset to "+System.currentTimeMillis();
}
}
那麼,我會看看使用'java.util.Timer'而不是發明自己的。也許也看看crontab,雖然你的用例似乎並不支持這一點。 – markspace