1、约定所有重要操作前都要拿redis锁,锁定义为start_key,针对某一特定资源,各处要拿的锁都是这个start_key。
2、所有线程尝试获取锁的方式都是自旋100秒,100秒都拿不到锁则放弃。
示例:
A线程,尝试获取锁完成操作A
boolean value = false;
int i = 0;
while (!value && i < 1000) {//自旋锁一百秒
i++;
// System.out.println("已自旋" + i + "次");
value = redisUtils.setnx("start_key", "get", 10);//拿锁,设定过期释放时间10秒,不够就加长
if (value) { //value为true才表示可以执行重要操作
//操作A写在这里,此处示例为睡眠5秒
//try {
// Thread.sleep(5000);//睡5秒
//} catch (InterruptedException e) {
//}
//操作完了
redisUtils.delete("start_key");//主动释放锁
}else{//说明没拿到锁
try {
Thread.sleep(100);//等100毫秒重新进入循环,尝试再次获取锁
} catch (InterruptedException e) {
}
}
}
B线程,尝试获取锁完成操作B
boolean value = false;
int i = 0;
while (!value && i < 1000) {//自旋锁一百秒
i++;
// System.out.println("已自旋" + i + "次");
value = redisUtils.setnx("start_key", "get", 10);//拿锁,设定过期释放时间10秒,不够就加长
if (value) { //value为true才表示可以执行重要操作
//操作B写在这里
//操作完了
redisUtils.delete("start_key");//主动释放锁
}else{//说明没拿到锁
try {
Thread.sleep(100);//等100毫秒重新进入循环,尝试再次获取锁
} catch (InterruptedException e) {
}
}
}