美文网首页
Java并发编程的艺术-并发编程的挑战

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

作者: 油多坏不了菜 | 来源:发表于2019-02-24 18:27 被阅读0次

    上下文切换

    假设单核系统, 而有多个线程,那么这些线程需要按时间片分配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并发编程的艺术-并发编程的挑战

          本文链接:https://www.haomeiwen.com/subject/vwsbyqtx.html