默认
发表评论 3
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已回复] MobileIMSDK未使用同步方式获取userid的疑问
管理员你好,我再阅读你的程序

你在获取userid时,如下操作
        public static int nextUserId(RegisterInfo loginInfo) {
                return ++__id;
        }



没有使用synchronized的方式,是否存在问题,我暂时还未做并发测试

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:MobileIMSDK
上一篇:[已回复] MobileIMSDK开发音视频即时通讯、图片消息的疑问下一篇:[已回复] MobileIMSDK连接数据库的疑问求助

本帖已收录至以下技术专辑

推荐方案
评论 3
不好意思,现在才回复你。你观察的很仔细,但这段代码理论上不会发生同步问题,原因很有趣,本着程序员严谨的态度,我帮你找了个例子,并且稍作改动,来证实我的结论,请往下看:

1)请先看看这个典型的因同步问题而发生的不可预测结果的例子:
http://blog.csdn.net/zhangxingping/article/details/8607688
以上例子的根本原因在于,当多线程同时操作某个变量时,谁先谁后,影响非常大,导致的结果根本不能预测,这就是典型的同步问题。

2)再看看我改造了上面的例子,把它改成MobileIMSDK里默认的nextId生成方法代码,来看看多线程本没有同步的情况下会发生什么:

[已回复] MobileIMSDK未使用同步方式获取userid的疑问_QQ20160613-0.png
可以看到,两个线程各循环执行10000次的结果(实际上例子1)里10次循环就足以出现问题了),输出结果依然是连续且规则的,而且最后的结果肯定是30000,这很有趣吧。但假设我们以例子1)的认知来认识例子2),可能会想当然的认为结果可能会重复,那么最后一个数必然不会是30000,但实际却不是这样!

那么例子2)中为什么不会因同步问题而导致结果不可预测?
原因在于:它们的所持有的变量实际上是一块内存地址,像例子1)里同步问题的表现就是:它们谁先、谁后调用这同一个变量是不可预测的,导致的结果也不可预测,而我们的例子里,其实谁先谁后也同样不可预测,但这并不重要的,重要的是无论谁先谁后,它拿到的结果必然是内存里的实际值+1,而最终的应用层表现就是肯定不会拿到重复的数值。

我修改后的代在这里,可以下载看看哦:
TTTTTT.rar (3.62 KB , 下载次数: 9 )

---------------

综上,MobileIMSDK里的nextId方法理论上会发生同步问题,但有趣的是这个同步问题对它是无害的,而且因为不需要显式synchronized,理论上带来的好处是并发性能的提升且不存在死锁风险。
引用:JackJiang 发表于 2016-06-13 22:58
不好意思,现在才回复你。你观察的很仔细,但这段代码理论上不会发生同步问题,原因很有趣,本着程序员严谨 ...

讲的很仔细,赞一个!
签名: 国庆长假还没有缓过来,请让我静一静,产品狗死远点...
引用:JackJiang 发表于 2016-06-13 22:58
不好意思,现在才回复你。你观察的很仔细,但这段代码理论上不会发生同步问题,原因很有趣,本着程序员严谨 ...

学习了!
签名: 星期六,那又怎样,还是得上班
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部