新开发的系统需要控制每个时刻回收缓存的GC线程有且只有一个在运行,如果有多个线程同时运行,会造成系统崩溃。如果只有一个JVM进程那么很好办,简单的借助synchronized关键字就行了。可是我的系统要部署在多台服务器,每台服务器上部署多个实例上。而synchronized仅仅在单进程里有用。
考虑借助共享数据源redis实现功能。
redis提供一个方法,SETNX key value。将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。设置成功,返回 1 。设置失败,返回 0 。
那么这个key就是一把锁,如果返回1,表示获取互斥锁成功,然后可以进入临界区。返回0,表示获取失败,无法进入临界区。
示例代码:
try { mutex = KeyHelper.Data.Risk.getGcThreadMutexKey(); if (dataCommonCacheService.setnx(mutex, "ok") == 1L) { // 尝试加锁 garbageCollector.garbageRecycle(); // 临界区 } } catch (Exception e) { LOG.error(e.getMessage(), e); } finally { dataCommonCacheService.del(mutex); // 释放锁 }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-12-18 20:50:20