行政还要负责网站建设新媒体吗上海最大的网络推广公司
2026/1/2 0:20:12 网站建设 项目流程
行政还要负责网站建设新媒体吗,上海最大的网络推广公司,wordpress 模板命名,富平做网站在 Java 服务端开发中#xff0c;Access Token 管理器必须是单例#xff08;Singleton#xff09;#xff0c;以确保整个应用只维护一个 Token 副本#xff0c;并使用强大的可重入锁#xff08;ReentrantLock#xff09; 来保证在高并发下的数据一致性。 1. Token 管理…在 Java 服务端开发中Access Token 管理器必须是单例Singleton以确保整个应用只维护一个 Token 副本并使用强大的可重入锁ReentrantLock来保证在高并发下的数据一致性。1. Token 管理器结构单例模式我们使用最常用的懒汉式或饿汉式单例模式来创建AccessTokenManager类。这里以饿汉式为例确保类加载时即完成初始化。public class AccessTokenManager { // 状态变量 private String accessToken null; private long expiresAt 0L; // 精确到毫秒的过期时间戳 // 线程安全的核心可重入锁 private final ReentrantLock lock new ReentrantLock(); // 单例实例饿汉式 private static final AccessTokenManager INSTANCE new AccessTokenManager(); // 构造方法私有化 private AccessTokenManager() { // 初始化配置 } // 对外提供获取实例的静态方法 public static AccessTokenManager getInstance() { return INSTANCE; } // ... getAccessToken 方法实现 }2. 核心方法getAccessToken 的实现逻辑getAccessToken方法负责检查当前 Token 的状态。其核心在于使用锁来保护 Token 刷新这一关键操作同时允许大量并发的读操作在 Token 有效时无需等待锁。逻辑流程快速检查检查当前 Token 是否在安全阈值例如 $10$ 分钟内有效。如果有效直接返回避免锁竞争。获取锁如果 Token 即将过期或已过期线程尝试获取ReentrantLock。此时其他线程将被阻塞。二次校验Double Check在获取锁后必须再次检查 Token 状态。因为可能在线程 A 释放锁的瞬间线程 B 立即获得了锁但线程 A 已经完成了刷新。执行刷新如果二次校验仍显示 Token 无效则线程 B 调用企业微信 API 执行刷新操作。更新和释放更新accessToken和expiresAt并在finally块中释放锁。Java 代码关键部分private void refreshAccessToken() { // 实际调用企业微信 API 的代码 // 假设 API 返回 { access_token: new_token, expires_in: 7200 } // 1. 调用 API 获取新 Token 和有效期 // APIResponse response callWeComApi(); // 2. 更新状态 this.accessToken 新获取的 Token; // response.getAccessToken(); // 设定过期时间为当前时间 7200秒 - 600秒安全边际 this.expiresAt System.currentTimeMillis() (7200 - 600) * 1000L; } public String getAccessToken() { long currentTime System.currentTimeMillis(); // 1. 快速检查 (无需锁) if (accessToken ! null currentTime expiresAt) { return accessToken; } // 2. 尝试获取锁进行刷新 lock.lock(); try { // 3. 二次校验 (在锁保护下) if (accessToken ! null currentTime expiresAt) { return accessToken; // 已被其他线程刷新直接返回 } // 4. 执行刷新 refreshAccessToken(); return accessToken; } catch (Exception e) { // 记录日志或抛出异常 throw new RuntimeException(Access Token 刷新失败, e); } finally { // 5. 确保锁释放 lock.unlock(); } }3. ReentrantLock 的优势相比于使用synchronized关键字ReentrantLock在这里的优势在于明确的锁定和释放必须手动调用lock()和unlock()强制要求开发者将释放锁的逻辑放置在finally块中防止异常导致死锁。非阻塞尝试ReentrantLock支持tryLock()可以尝试获取锁如果获取失败线程可以选择做其他事情而不是无限等待。条件变量支持Condition可以更精细地控制线程的等待和唤醒虽然在这个简单的 Token 场景中用不到但在更复杂的并发任务中非常有用。通过这种设计AccessTokenManager成为了一个高可用、线程安全的 Token 抽象层为上层的所有 API 调用提供了稳定的保障。QiWe开放平台提供了后台直登功能登录成功后获取相关参数快速Apifox在线测试所有登录功能都是基于QiWe平台API自定义开发。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询