java另启线程,发送短信相关问题及验证
今天遇到一个场景,就是现在系统的发送短信接口出了故障,导致主业务变慢
刚开始做的时候,没有用异步另起线程的方法,现在出问题了想着改一下
把相关发送短信的代码提取出来写到Thread 类中的run 方法,如下图

刚开始的时候没有加synchronized 关键字,也是可以正确执行的
后来考虑到并发,就加上去了,以前也没遇见过类似问题,缺乏经验,借这次机会也多了解了解
如果不加synchronized关键字,那当两个线程同时访问到run 方法时,有可能发送的内容,不是第一个线程的map
后来我又想,加了synchronized ,这个map 依然会被多个线程操作导致出现上述情况
然后在网上百度多个线程操作同一个属性的问题,刚开始想会有一个关键字之类的,来防止多个线程同时访问一个属性,或是排队的方式,当然排队的话效率就变低了
后来我看一篇文章,说是把集合类变成线程安全的,然后我就把hashMap 改为了hashtable,hashtable 里的方法都加了synchronized 关键字,是线程安全的
然后查hashtable 线程安全的原理,讲是如果一个线程访问hashtable 中的一个元素时,这个锁是作用在全部元素上面的,如果hashtable 中元素比较少那还可以
如果到1000 2000 ,那就会特别慢,后来看到说是ConcurrentHashMap ,jdk1.7 中增加了这个类,存储方式跟hashtable 基本一样,就是加锁的方式不同,
ConcurrentHashMap 是分段加锁,像1000个元素的集合,可以加100个锁,当线程访问到其中一段时,就单独锁住那一段,不影响其他的段进行操作
到jdk 1.8 的时候,对这个类又有了新的优化,只是使段的颗粒度更小,效果上是很明显的
以下是参考文章链接:
https://blog.csdn.net/u010653908/article/details/53419685/
https://blog.csdn.net/zhanglei082319/article/details/87888250

浙公网安备 33010602011771号