java - 在多线程环境中使用Java Singleton实例

标签 java multithreading singleton

我的应用程序想要与 REST 服务器通信。首先,我们需要进行身份验证,并且作为响应,我们将收到一个客户端 token 。此 token 的有效期为 30 分钟,对于其余的通信,此客户端 token 需要作为 header 出现。

我计划实现一个处理 REST 通信的单例类。不遵循 ENUM 方法(如许多其他线程中提到的)的原因是需要进行剩余调用并在运行时填充客户端 token 。

public class RESRService {

    private static RESRService RESTSERVICEINSTANCE;
    private String clientToken;

    private RESRService(){
        clientToken = //make a rest call to authenticate and get the client 
                      //token from reponse
    }

    public static RESRService getInstance(){
        if(RESTSERVICEINSTANCE == null){
            RESTSERVICEINSTANCE = new RESRService();
        }

        return RESTSERVICEINSTANCE;
    }

    public void makeRestCall(String requestSpecificInfo){
        //set client token to header
        //create JSON body using requestSpecificInfo
        //make rest call
    } 

}

这里的主要挑战是这个类将同时被多个线程使用(所有线程的客户端 token 都是相同的)。我的疑问是关于我们进行 REST 调用来填充客户端 token 的初始化部分。如果 REST 调用需要几秒钟来设置客户端 token ,那么线程之间是否可能存在歧义。如果是,您认为实现此目的的最佳方法是什么?

最佳答案

如果你有一个多线程应用程序并使用单例模式,则可以使用synchronized关键字。

public static synchronized RESRService getInstance(){}

但是 getInstance() 方法是同步的,因此会导致性能下降,因为多个线程无法同时访问它,并且所有操作都是同步的。所以你可以使用Double checked locking解决方案。

private static volatile RESTSERVICE RESTSERVICEINSTANCE;

public static RESTSERVICE getInstance(){
    RESTSERVICE restservice = RESTSERVICEINSTANCE;
    if(restservice == null){
        synchronized (RESTSERVICE.class){
            restservice = RESTSERVICEINSTANCE;
            if(restservice == null){
                restservice = new RESTSERVICE();
            }
        }
    }
    return restservice;
}

关于java - 在多线程环境中使用Java Singleton实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56232753/

相关文章:

java - 是否有任何 JVM 不使用分代垃圾收集

java - Pact 提供者测试的范围应该是什么?

c# - 我是否需要使用 try catch 或检查 ThreadPool.QueueUserWorkItem 的返回值

java - Dao 服务作为单例?

android - 尝试从 Android 中的应用程序上下文访问资源

c++ - QMessageLogger : Singleton for a Logger?

java - gradle类没有生成

java - JBoss 7.1.1中weblogic的Application.xml文件

c - pthread 如何返回最快的结果并终止较慢的结果?

java - Java 中使用 lambda 和 Callable 的数独多线程