场景:防止手机号发送短息多次发送
代码:
/**
* @data 2021/12/18 12:07
* @author: bird
* @description: 场景:1s之内有100次请求过来 只能允许一个手机号放行
* 结果: 最多允许一个线程执行。如果是3个服务器会存发送三处
*/
public class Main {
//定义一把公平锁
public static ReentrantLock lock = new ReentrantLock(true);
private static ConcurrentHashMap<String, String> map = new ConcurrentHashMap();
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(50);
for (int i = 0; i < 50; i++) {
threadPool.submit(new Task("18321682662"));
}
threadPool.shutdown();
}
static class Task implements Runnable {
private String phone;
public Task(String phone) {
this.phone = phone;
}
@Override
public void run() {
lock.lock();
try {
// 先查看手机是否存在 存在的话就阻断 不存在的话就执行下面的逻辑
String value = map.get(phone);
if (StringUtils.isEmpty(value)) {
map.put(phone, phone);
System.out.println("线程名称:" + Thread.currentThread().getName() + " " + "手机号: " + phone + " 已发送短信");
} else {
System.out.println("线程名称:" + Thread.currentThread().getName() + " " + "手机号:" + phone + " 请勿重复发送");
}
} finally {
lock.unlock();
}
}
}
}