0%

老师总结:多线程并发的使用、学习与测试

2018年8月19日 下午7:31

多线程并发的使用、学习与测试_慕课手记

  1. 就这一方面而言,对于开发者及学过并发的学员,平时开发中需要掌握的主要包括
    • 先说涉及最多的。看到static修饰的变量时,能想到涉及到多线程资源共享。如果是可变的,需要注意变化中的线程安全;如果是不可变的,需要知道如何保证其不可变,而不是简单的放在那,当前代码没有修改他就认为他是不变的。
    • 看到final、单例等定义时,能分析出是否是线程安全的。
    • 在看到集合、Map等结果时候时,知道该选什么类更适合,以及什么时候适合使用并发类,什么时候适合使用普通的类,这里本质上有对线程封闭的理解。
      • 其实就是容器的使用
    • 在遇到SimpleDateFormat等线程不安全的类时,能知道相关的并发风险点
    • 在需要完成一些大任务时,知道如何借助线程池等进行提速,以及借助AQS相关组件进行一些线程的调度
    • 知道常用的线程安全手段,能根据场景去分析是否需要加锁来保证线程安全。
  2. 继续谈多线程的使用。之前介绍的是我们不得不处理的多线程,接下来介绍主动创建的多线程的使用,即我们在代码里主动使用多线程去处理一些业务。
    • 提速,充分利用CPU:这个理解起来应该比较容易,同一个任务,多个线程同时处理,让很多处理并行,达到更快完成的目的。这里介绍的一个场景,之前项目做大发布,要清洗历史数据(比如要根据id取出某一行,并计算某个值填进去),由于数据量很大,单线程清洗可能要1个小时左右,为了能尽快完成,不影响发布的时间,因此我们把单线程改为10个线程并行,测试发现10个线程还是有些慢,后来调整为20个线程同时处理,这样最终在3min左右完成。
    • 降速,协调资源的使用:刚说完提速,这里又说降速,许多人可能会很奇怪。这里举具体例子来说明一下,比如项目里要发短信,目前有第三方的限制是并发量最多10条,而每天高峰期时段同一时刻需要发送的短信量可能远高于10条,这时怎么办呢?就可以在发短信时引入线程池及多线程池处理,通过semaphore等控制同时发短信的线程不超过10,这样就起到了降速的作用。
    • 异步处理,解耦。通常我们在做一个业务实现时,都有主流程和次流程之分,比如我们用户下单时,同时还要完成记录核心日志(核心的日志可能要记录的数据库中)以及通知用户下单完成等非核心业务,这些非核心的业务在处理时,有时可能会很耗时,出任何错还不能让主流程失败,出错了还需要重试慢慢完成,这种的就可以开启新的线程去处理,异步解耦,让主流程快速完成并返回。当然,也不能无限制的开启新线程,放在线程池里控制更好。
    • 许多人不知道如何使用多线程,希望这几点总结能让加深你的理解。关于多线程的使用,在什么场景该使用什么场景不该使用不是背下来的,而是需要结合实际场景分析,是否需要进行提速、降速、异步处理等,如此才能在工作中较好的使用多线程。