Refresh lazy val



我需要从服务器惰性地获得访问令牌,因此我有以下代码:

object MyObj {
val accessToken: String by lazy { getAccessTokenFromHttpApi(username, password) }
}

这工作得很好,是线程安全的,这是一个要求,因为我从多个线程获得访问令牌。

现在我知道这个服务器发出的访问令牌在一小时后过期。如果应用程序已运行超过一个小时,则访问令牌将被拒绝。当发生这种情况时,需要使用对getAccessToken...()的另一个调用来刷新它。然而,我不能刷新accessToken的值,因为它是一个不可变的val。我如何刷新,同时仍然保持线程安全?

Val不是不可变的,它是只读的!下面是一个简单的例子,告诉你如何解决这个问题

class AcessToken(var t : String){
val token: String
get() = this.t
}
val token = AcessToken("asd")
println(token.token) //asd
//refresh should be executed as synchronized
synchronized(token){
token.t = "dsa"        
}
println(token.token) //dsa

最新更新