前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MQ监听器下多线程安全问题

MQ监听器下多线程安全问题

作者头像
林老师带你学编程
发布2019-07-31 14:39:22
1.1K0
发布2019-07-31 14:39:22
举报
文章被收录于专栏:强仔仔强仔仔

背景

今天在写MQ队列监听器队列的时候,突然有一个疑问,局部变量会不会受到多线程的影响,所以为此做了一个实验。

实验

我在监听器中定义了两个变量,一个是类变量,一个是局部变量。然后设置监听器的并发线程为2个、一次抓取线程的消息个数为10个,具体代码如下所示:

代码语言:javascript
复制
public int countPublic = 0;

@Override
@RabbitHandler
@RabbitListener(queues = "amz_advertisement:big_info", containerFactory = "rabbitListenerContainerFactoryAmzAdvertisementBig")
public void process(Message msg, Channel channel) {
    int countPrivate = 0;
    try {
        countPrivate++;
        countPublic++;
        logger.error("countPrivate:{},countPublic:{}", countPrivate, countPublic);
    } catch (Exception e) {
        logger.error("bigInfo错误,错误信息为:{}", ExceptionUtil.formatException(e));
    }
}

然后循环发送100个消息,推送到指定队列中,具体代码如下所示:

代码语言:javascript
复制
@RequestMapping("/sendMQ/{message}")
public Object sendMQ(@PathVariable("message")  String message) throws InterruptedException {
    for (int i=0;i<100;i++){
        Thread.sleep(100);
        amqpTemplateDelay.convertAndSend("amz_advertisement:big_info", "我是测试amz_advertisement:info的测试数据");
    }
    return "发送成功";
}

结果如下所示:

RabbitListenerEndpointContainer#0-1 [BigInfoAdvertistingListener.java: 43] - countPrivate:1,countPublic:1

RabbitListenerEndpointContainer#0-1 [BigInfoAdvertistingListener.java: 43] - countPrivate:1,countPublic:3

RabbitListenerEndpointContainer#0-2 [BigInfoAdvertistingListener.java: 43] - countPrivate:1,countPublic:3

RabbitListenerEndpointContainer#0-2 [BigInfoAdvertistingListener.java: 43] - countPrivate:1,countPublic:4

从结果中,我们可以很明显的看到:局部变量一致都是1没有递增,但是类变量一直在递增。

这是因为Spring默认以单例模式创建对象,所以多线程模式下类变量就会存在线程安全问题。但是局部变量,在多线程模式下是线程安全的,各个线程之间的局部变量都是独享的。

总结

有时候我们写代码不注意,就会把局部变量写成类变量,这个时候如果是多线程模式,那将是灾难性的。所以我们平时写代码一定要严谨,不要变量位置随意放置。今天的初试多线程就到这边,下一讲博主将会深入的给大家介绍复杂多线程应用场景。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年07月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档