并发编程的挑战

上下文切换

减少上下文切换的方法

  • 无锁并发编程
  • CAS算法
  • 使用最少线程
  • 协程(在一个线程中实现多任务调度)

监控程序

查看进程中的线程

  • jstack 30587 > /app/sssc-soa-starindex/dump1

分析线程信息文件

  • grep java.lang.Thread.State dump1 | awk ‘{print $2$3$4$5}’ | sort | uniq -c

查看线程状态,是否堵塞或进行多次的上下文切换

重新配置线程池信息,重启服务,查看线程运行效果,是否进行了多次线程切换

死锁

导致死锁的原因

  • 第一个线程等待第二个线程释放资源,而第二线程在等待第一个线程释放资源。

产生死锁的条件

  • 互斥等待(同步的原理)
  • Hold and Wait
  • 循环等待
  • 无法剥夺的等待

避免死锁的方法

  • 一次性获取from和 to锁,无法实现
  • 按顺序获取锁
  • 加入超时,如果超时,就释放锁(不推荐)

资源限制的挑战

什么是资源限制

  • 在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。比如硬件资源限制有宽带的上传/下载速度、硬件读写速度和CPU的处理速度。软件资源限制有数据库的连接数和socket连接数等。

资源限制引发的问题

  • 并发程序在资源限制的情况下,运行起来比串行还慢。

解决资源限制引发的问题

  • 使用集群,多机部署
  • 软件资源:线程池、连接池复用