增加锁的方法有synchronized和lock方法两种方法各有千秋。synchronized: 可以加载方法上,方法体内,类上。 自动获取锁,自动是否释放锁。 不会造成死锁。lock: 方法体内。 手动获取锁 手动是否锁 如果出现异常而没有手动释放锁 则造成死锁。但不适用在分布式项目中,所以我们用Redis进行锁操作。
应用场景角色班级分配人数对管理人数进行加锁
@RequestMapping("text")
public String decrease(Integer id)
{
ValueOperations<String, String> opsForValue = stringRedisTemplate.opsForValue();
Boolean bool = opsForValue.setIfAbsent("role::" + id, "0");//占用资源,如果占用成功返回true表示当前线程获取锁了
if(bool)
{
try {
Integer num = role.selenum(id);
if (num > 0) {
role.jianshao(id); //减少该角色班级人数
System.out.println("角色最多能可以分配" + (num - 1)+"人");//剩余最大管理人数
return "success";
} else {
System.out.println("达到最少管理人数减少管理失败");
return "error";
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
stringRedisTemplate.delete("role::" + id);//释放分布式锁
}
}
System.out.println("等待服务器");
return "waiting";
}
进行测试启动多个项目
用测试工具设置测试线程数
设置不同端口8080和8081
设置数据如果数据小于零则表示分布式锁没有生效