@Lock4j
使用示例:
@Transactional(rollbackFor = Exception.class)
@Lock4j(name = "project:operate", acquireTimeout = 0, keys = {"#req.projectId"})
public void change(TaskManageReqVo req) {
//TODO
}
这是一个Java锁定注解,它可以用来锁定一个特定的项目,以便在操作过程中保持它的完整性。
-
@Lock4j
注解有三个参数:name
,acquireTimeout
和keys
。 -
name
参数用于指定锁定的名称, -
acquireTimeout
参数用于指定锁定的超时时间。当acquireTimeout
参数被设置为0时,表示锁定操作不会超时,也就是说,只要满足锁定条件,就可以一直获取锁定,直到锁定被释放为止。 -
keys
参数用于指定锁定的键值。
在这个例子中,name
参数被设置为“project:operate”,acquireTimeout
参数被设置为0,keys
参数被设置为“#req.projectId”,这意味着只有当#req.projectId
的值与锁定的键值相匹配时,才能获取锁定。
-
lock4j与@Transactional类似:将注解写在方法上,自动控制上锁与释放锁。
-
lock4j支持Redis(RedisTemplate或Redisson)、Zookeeper作为底层
- 2.0之后支持Redisson和Zookeeper
- 建议基于Redisson
- 原因:可以利用redisson的特性:自动续期等
- 方法:引入依赖:lock4j-redisson-spring-boot-starter
-
执行顺序
如果在service上有@Transactional和@lock4j,则执行顺序如下
# 1. 上锁 # 2. 开启事务 # 3. 执行逻辑 # 4. 提交/回滚事务 # 5. 释放锁
-
实现原理
AOP:Advisor + methodInterception -
@Lock4j可以使用
java.util.concurrent.locks.ReentrantLock
来代替@Lock4j
注解,它可以实现类似的功能,但是需要自己编写代码来实现
@Notnull
@NotNull
注解用于标记一个方法的参数或返回值,表示该参数或返回值不能为null,否则会抛出NullPointerException
异常。