Spring Boot 3.2.2 连接 RocketMQ 5.1.2 报错如何解决?
Started container failed. DefaultRocketMQListenerContainer{consumerGroup='topic_02_CONSUMER', namespace='', namespaceV2='', nameServer='192.168.50.20:9876', topic='topic_02', consumeMode=CONCURRENTLY, selectorType=TAG, selectorExpression='*', messageModel=CLUSTERING', tlsEnable=false, instanceNam...
1 回答1.1k 阅读✓ 已解决
参考这篇文章,我来翻译一下:
这是一个方法,它具有原子性:
这也是一个方法,它也具有原子性:
所谓原子性,就是方法里的语句会顺次执行,不会被打断。
但是你把它俩复合起来,它就不再是原子的了:
在这里开了两个线程,一个执行第一个方法,另一个执行第二个方法,第一个方法一上来先获取了向量的尺寸,然后就开始休眠了,趁第一个方法不注意,第二个方法进来删除了向量里最后一个元素,等第一个方法醒过来,再想找最后一个元素找不着了,就抛出错误了,所以复合操作不具有原子性,中间被插入打断了。
解决的方法就是加个锁:
synchronized
就是同步的意思,同步的意思是说这一步迈不完,下一步不能开始,所以这样就保证了整个操作依然是原子级的,不存在被插入的可能。