# lock **Repository Path**: efeichong/lock ## Basic Information - **Project Name**: lock - **Description**: # 同步锁 - 线程同步锁 - 基于redis的分布式锁 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-06-22 - **Last Updated**: 2022-08-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 同步锁 - 线程同步锁 - 基于redis的分布式锁 ### 使用方式 #### 1. 在方法上面加 @Lock即可 key的要求: 写法1. theKey 写法2. ${com.test.MyConcatUtils.concat()} 这种写法要求 - 以${}做包裹 - 包路径必须正确,类必须为public修饰 - 方法必须是静态方法且为public修饰 - 该静态方法内如需用到spring装配请使用 {@link SpringUtils#getBean(String)} 例如: ```$xslt //@Lock(key = "key",lockType = LockType.THREAD_LOCK,retryCount = 1,lockExpireTime = 5*1000L,retryTimeInterval = 10L) @Lock(key = "${com.util.getMyKey()}",lockType = LockType.THREAD_LOCK,retryCount = 1,lockExpireTime = 5*1000L,retryTimeInterval = 10L) @Transactional @Override public void insertStudent(StudentVo studentVo){ studentDao.saveOrUpdate(TransformUtils.toPo(Student.class,studentVo)); } ``` #### 2. 手动使用锁 ```$xslt @Transactional @Override public void insertStudent(StudentVo studentVo){ EnhanceReentrantLock lock = new EnhanceReentrantLock(); // RedisReentrantLock lock = new RedisReentrantLock(); try { lock.lock("key"); studentDao.saveOrUpdate(TransformUtils.toPo(Student.class,studentVo)); } finally { lock.unlock("key"); } } ``` | 参数 | 值 | 说明 | 是否必须 | | --- |--- | --- | --- | | key |String| 唯一key,字符串或者用${}包裹的方法全路径静态方法 | 是| | lockType|LockType| 锁类型 redis,线程重入锁 默认使用 线程重入锁 |否| | lockExpireTime|long| 锁自动过期时长(大于0设置时间有效,小于等于0则为永不过期),过期自动释放,默认永不过期 单位:毫秒 |否| | retryCount|long| 自动重试次数,默认不重试 |否| | retryTimeInterval|long | 重试时间间隔,默认10毫秒,与重试次数配合使用 单位:毫秒 |否|