今天写一个接口,接口需要获取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();
}
}
运行结果: