LockTestController 类:
package com.xiepanpan.locks.lockstest.controller;
import com.xiepanpan.locks.lockstest.service.RedissonLockService;
import org.redisson.api.RCountDownLatch;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: xiepanpan
* @Date: 2020/2/24
* @Description: Redisson 锁测试
*/
@RestController
public class LockTestController {
@Autowired
RedissonLockService redissonLockService;
/**
* 拉闸停电
* @return
* @throws InterruptedException
*/
@GetMapping("/switchOff")
public String switchOff() throws InterruptedException {
return redissonLockService.switchOff();
}
/**
* 下班回家
* @return
*/
@GetMapping("/goHome")
public String goHome() {
return redissonLockService.goHome();
}
}
RedissonLockService 类:
package com.xiepanpan.locks.lockstest.service;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RCountDownLatch;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author: xiepanpan
* @Date: 2020/2/24
* @Description: redisson 分布式锁
*/
@Service
@Slf4j
public class RedissonLockService {
@Autowired
RedissonClient redissonClient;
public String switchOff() throws InterruptedException {
//这里缓存里设置的值是5 意思是还有5个人没走
RCountDownLatch countDownLatch = redissonClient.getCountDownLatch("num");
//trySetCount意思是从缓存取的num是0或者没有这个key 创建key设置值是5
// countDownLatch.trySetCount(5);
log.info("我要拉闸了 下班了赶紧走 不要浪费公司的电");
//大爷处于等待状态 看看谁还没走
countDownLatch.await();
log.info("拉闸断电!");
return "拉闸断电!";
}
public String goHome() {
RCountDownLatch countDownLatch = redissonClient.getCountDownLatch("num");
countDownLatch.countDown();
log.info("溜了溜了。。。");
return "溜了溜了。。。";
}
}
效果:
五个人没走完 switchOff请求会一直处于等待状态 五个人走完后才会返回结果