2020最新的Spring Boot 分布式锁的具体实现(内附代码) (2)

模拟并发测试

/** * redis分布式锁控制器 * @author gourd * @since 2019-07-30 */ @RestController @Api (tags = "redisson" , description = "redis分布式锁控制器" ) @RequestMapping ( "/redisson" ) @Slf4j publicclass RedissonLockController { /** * 锁测试共享变量 */ private Integer lockCount = 10 ; /** * 无锁测试共享变量 */ private Integer count = 10 ; /** * 模拟线程数 */ privatestaticint threadNum = 10 ; /** * 模拟并发测试加锁和不加锁 * @return */ @GetMapping ( "/test" ) @ApiOperation (value = "模拟并发测试加锁和不加锁" ) publicvoidlock (){ // 计数器 final CountDownLatch countDownLatch = new CountDownLatch ( 1 ); for ( int i = 0 ; i < threadNum; i ++) { MyRunnable myRunnable = new MyRunnable (countDownLatch); Thread myThread = new Thread (myRunnable); myThread.start(); } // 释放所有线程 countDownLatch.countDown(); } /** * 加锁测试 */ privatevoid testLockCount() { String lockKey = "lock-test" ; try { // 加锁,设置超时时间2s RedisLockUtil . lock (lockKey, 2 , TimeUnit .SECONDS); lockCount--; log.info( "lockCount值:" +lockCount); } catch ( Exception e){ log.error(e.getMessage(),e); } finally { // 释放锁 RedisLockUtil .unlock(lockKey); } } /** * 无锁测试 */ privatevoid testCount() { count--; log.info( "count值:" +count); } publicclass MyRunnable implements Runnable { /** * 计数器 */ final CountDownLatch countDownLatch; public MyRunnable ( CountDownLatch countDownLatch) { this .countDownLatch = countDownLatch; } @Override publicvoid run() { try { // 阻塞当前线程,直到计时器的值为0 countDownLatch. await (); } catch ( InterruptedException e) { log.error(e.getMessage(),e); } // 无锁操作 testCount(); // 加锁操作 testLockCount(); } } } 调用接口后打印值:

2020最新的Spring Boot 分布式锁的具体实现(内附代码)

测试结果

根据打印结果可以明显看到,未加锁的 count-- 后值是乱序的,而加锁后的结果和我们预期的一样。

由于条件问题没办法测试分布式的并发。只能模拟单服务的这种并发,但是原理是一样,希望对大家有帮助。如有错误之处,欢迎指正。

最后

私信回复 资料 领取一线大厂Java面试题总结+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!

这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。

file

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zysjzd.html