Nous avons examiné l'implémentation du traitement exclusif (Java) lors du partage d'un jeton chronométré pour l'authentification API Web (en supposant un jeton d'accès OAuth2) entre plusieurs threads.
Les spécifications de la gestion des jetons supposent ce qui suit.
La classe de gestion de jetons qui fonctionne avec les spécifications ci-dessus est implémentée comme suit.
public class TokenManager {
//Motif singleton
private static TokenManager instance = new TokenManager();
private TokenManager() {}
public static TokenManager getInstance() {
return instance;
}
/*Le jeton et la date et l'heure de modification doivent être des variables volatiles afin que le dernier état puisse toujours être obtenu au moment de la référence.*/
//Jeton chronométré
private volatile String token = null;
//Date et heure de mise à jour (horodatage UNIX) calculées à partir de la période de validité du jeton
private volatile long refreshAt = 0L;
//La synchronisation n'est pas requise car le dernier état est acquis avec une variable volatile.
public String getToken() {
if (System.currentTimeMillis() >= refreshAt) {
syncUpdateToken();
}
return this.token;
}
//Le traitement des mises à jour est synchronisé et contrôlé exclusivement (de sorte qu'un seul thread peut être exécuté à la fois)
private synchronized void syncUpdateToken() {
//Ne réexécutez pas le processus de mise à jour dans le thread suivant qui a appelé getToken pendant le processus de mise à jour
if (System.currentTimeMillis() < refreshAt) {
return;
}
//Processus de mise à jour des jetons
//Pour vous assurer que vous obtenez le dernier jeton lorsque vous réussissez la vérification de la date d'expiration avec la méthode getToken
// token ->Actualiser dans l'ordre de refreshAt.
this.token = ...
this.refreshAt = ...
}
}
En rendant les variables d'instance (token, refreshAt) volatiles, il n'est pas nécessaire de synchroniser la méthode de référence de token (getToken) et le traitement de référence dans la date d'expiration du token peut être exécuté en parallèle.
Dans ce cas, étant donné que le thread suivant qui a appelé getToken pendant le processus de mise à jour appelle la méthode de mise à jour du jeton (updateToken), la date d'expiration est à nouveau vérifiée dans la méthode pour éviter un processus de mise à jour inutile du jeton.
Recommended Posts