java - 在服务器端有一个后台线程定期更新请求使用的一些数据的最佳实践?

标签 java multithreading server backend

我有一个提供 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();
     }
}

最佳答案

您的实现完全有效。 volatile 的主要目的正是以线程安全的方式在线程之间共享引用。除了 volatile 语义之外,ReaderWriterLock(以及任何锁定)允许一起执行复合操作(原子),而无需在线程之间交错。但是,由于您没有任何应该一起执行的复合操作,所以在您的情况下, volatile (比锁定便宜)就足够了。

您还可以发现 Executors.newSingleThreadScheduledExecutor() 对于调度后台任务很有用。

关于java - 在服务器端有一个后台线程定期更新请求使用的一些数据的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46203725/

相关文章:

java - 批处理 - Natives、Jars 和松散类文件

java - 通过 AbstractTableModel 获取选定的行

java - 如何重置 JDBC 连接池

multithreading - 为什么本地创建的结构不能发送到另一个线程?

c - 关于so​​cket编程中这个strncpy函数的一个问题

php - HTML 下载链接失败的可能原因是什么?

python - 在CENTOS上安装Google Cloud SDK : Not finding correct Python version

java - 设置 Firebird 以使用 JDBC 进行远程访问

java - 如何同时执行两个方法才能保证不延迟?

python - 为什么这个多线程代码会超出它的 while 条件?