Java并发编程的艺术-并发编程的挑战

上下文切换

假设单核系统, 而有多个线程,那么这些线程需要按时间片分配cpu资源。一个线程占用的cpu时间片到期后释放cpu,然后另外一个线程获得cpu资源,这个过程就叫做上下文切换。显然,线程切换涉及到信息的保存与恢复,是会影响多线程执行效率的。

  • 所以多线程不一定更快,需要考虑线程创建与线程切换的时间,对于cpu密集型任务分配太多线程显然是不合理的
  • vmstat 工具可以查看希提通每秒的上下问切换次数(cs参数),图中系统每秒上下文切换400次左右。


    上下文切换.png
  • 减少上下文切换:无锁并发编程(多线程竞争锁时,会触发上下文切换);CAS算法(不加锁);使用最少线程;协程(单线程里面实现多个任务的调度)

减少上下文切换思路

  1. 用jstack dump线程信息,可以看到里面每个线程在做
    什么
    jstack pid > /home/pepper/dump.txt
  2. 统计所有线程所处的状态
    grep java.lang.Thread.State dump.txt | awk '{print $2$3$4$5}' |sort | uniq -c
  3. 对于上面统计出来的数据分析,看看是否合理,假如waiting(waiting 到runalbe存在线程切换) 状态的线程太多,那么就应该到dump文件中看看这些waiting线程的信息,然后修改相应的配置。

死锁

  • 死锁的概念,式例程序
  • 线程dump 信息解决死锁问题

你可能感兴趣的:(Java并发编程的艺术-并发编程的挑战)