import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.redisson.RedissonMultiLock;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.xml.sax.SAXException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class RedissonMultiLockTest {
@Autowired
private RedissonClient redissonClient;
ExecutorService executorService = Executors.newFixedThreadPool(2);
@After
public void after() {
}
@SneakyThrows
@Test
public void testTryMultiLockFailure() {
Runnable task1 = () -> {
RLock lock1 = redissonClient.getLock("lock1");
RLock lock2 = redissonClient.getLock("lock2");
RedissonMultiLock multiLock = new RedissonMultiLock(lock1, lock2);
boolean isLockedSuccessfully = false;
try {
boolean hasLock = multiLock.tryLock(1L, 10L, TimeUnit.SECONDS);
if (hasLock) {
isLockedSuccessfully = true;
log.info("执行线程1的逻辑-开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("线程1在执行过程中被中断", e);
throw new RuntimeException(e);
}
log.info("执行线程1的逻辑-结束");
} else {
log.info("执行线程1获取锁失败");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
if (isLockedSuccessfully) {
multiLock.unlock();
log.info("锁已释放");
}
}
};
Runnable task2 = () -> {
RLock lock = redissonClient.getLock("lock1");
boolean isLockedSuccessfully = false;
try {
boolean hasLock = lock.tryLock(0L, 5L, TimeUnit.SECONDS);
if (hasLock) {
isLockedSuccessfully = true;
log.info("执行线程2的逻辑-开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("线程1在执行过程中被中断", e);
throw new RuntimeException(e);
}
log.info("执行线程2的逻辑-结束");
} else {
log.info("执行线程2获取锁失败");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
};
Runnable task3 = () -> {
RLock lock = redissonClient.getLock("lock2");
boolean isLockedSuccessfully = false;
try {
boolean hasLock = lock.tryLock(0L, 5L, TimeUnit.SECONDS);
if (hasLock) {
isLockedSuccessfully = true;
log.info("执行线程3的逻辑-开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
log.error("线程1在执行过程中被中断", e);
throw new RuntimeException(e);
}
log.info("执行线程3的逻辑-结束");
} else {
log.info("执行线程3获取锁失败");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
if (isLockedSuccessfully && lock.isLocked()) {
lock.unlock();
}
}
};
Future<?> future1 = executorService.submit(task1);
Thread.sleep(20);
Future<?> future2 = executorService.submit(task2);
Future<?> future3 = executorService.submit(task3);
future1.get();
future2.get();
future3.get();
}
@SneakyThrows
@Test
public void test2() {
Runnable task1 = () -> {
try {
log.info("执行线程1的逻辑-开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("执行线程1的逻辑-结束");
} catch (Exception e) {
throw new RuntimeException(e);
}
};
Future<?> future1 = executorService.submit(task1);
future1.get();
}
@Test
public void test1() {
Runnable task1 = () -> {
try {
log.info("执行线程1的逻辑-开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("执行线程1的逻辑-结束");
} catch (Exception e) {
throw new RuntimeException(e);
}
};
executorService.submit(task1);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2022-06-18 idea去除文档注释