GetToken的故事

这篇博客讲述了在接口中如何确保获取到的Token始终保持有效。当Token可能过期时,作者设计了一个使用标识符和锁的策略。当Token需要刷新时,会加锁,其他请求等待,直到刷新完成后解锁,从而确保所有请求使用的都是最新的Token。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天写一个接口,接口需要获取token,然后通过token访问,但是token可能会过期(失效),于是我要写一个获取token的方法,保证所有请求获取到的 token 都是有效的,

那么,方案来了,声明一个标识符,标识是否需要枷锁,在token失效,刷新token的时候,进行枷锁,getToken 等待,刷新token的时候先将 标识设置为 true,然后获取完新的token之后设置为false。

具体代码:

package zzq.thread;

import java.util.Date;

public class GetToken {

    private String token;

    private boolean needLock = false;

    public String getToken() {
        if(needLock){
            synchronized (this){
                if (needLock) {
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return this.token;
    }

    public  String reflushToken() {
        synchronized (this){
            this.needLock = true;
            try {
                long t = (long) (Math.random() * 5000);
                System.out.println("休眠" + t + "ms" );
                Thread.sleep(t);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            this.token = "zzq";
            this.notify();
            this.needLock = false;
        }
        return token;
    }

    public static void main(String[] args) throws InterruptedException {
        GetToken token = new GetToken();

        new Thread("t1") {
            @Override
            public void run() {
                String t = token.getToken();
                if (t == null) {

                    System.out.println(token.reflushToken() + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                } else {
                    System.out.println(t + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                }
            }
        }.start();
        new Thread("t2") {
            @Override
            public void run() {
                String t = token.getToken();
                if (t == null) {

                    System.out.println(token.reflushToken() + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                } else {
                    System.out.println(t + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                }
            }
        }.start();
        new Thread("t3") {
            @Override
            public void run() {
                String t = token.getToken();
                if (t == null) {

                    System.out.println(token.reflushToken() + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                } else {
                    System.out.println(t + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                }
            }
        }.start();
        new Thread("t4") {
            @Override
            public void run() {
                String t = token.getToken();
                if (t == null) {

                    System.out.println(token.reflushToken() + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                } else {
                    System.out.println(t + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                }
            }
        }.start();
        System.out.println("休眠5000ms");
        Thread.sleep(5000);
        new Thread("t5") {
            @Override
            public void run() {
                String t = token.getToken();
                if (t == null) {

                    System.out.println(token.reflushToken() + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                } else {
                    System.out.println(t + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                }
            }
        }.start();
        new Thread("t6") {
            @Override
            public void run() {
                String t = token.getToken();
                if (t == null) {

                    System.out.println(token.reflushToken() + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                } else {
                    System.out.println(t + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                }
            }
        }.start();
        new Thread("t7") {
            @Override
            public void run() {
                String t = token.getToken();
                if (t == null) {

                    System.out.println(token.reflushToken() + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                } else {
                    System.out.println(t + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                }
            }
        }.start();
        new Thread("t8") {
            @Override
            public void run() {
                String t = token.getToken();
                if (t == null) {

                    System.out.println(token.reflushToken() + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                } else {
                    System.out.println(t + "===>" + Thread.currentThread().getName() +"nowDate====>" + new Date());
                }
            }
        }.start();
    }


}

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值