第1章,并发编程的挑战
程序员文章站
2022-05-13 14:59:50
...
一、几个好用的命令
1、vmstat
其中的cs字段,可以查看上下文切换的次数。
vmstat 1:表示查询一秒内上下文切换多少次。
2、jstack pid
其中pid为java进程id,或者说是tomcat的进程id
jstack 2822 > 2717.dump
3、分析结果
grep java.lang.Thread.State 2717.dump | awk '{print $2$3$4$5}' | sort | uniq -c
1、grep:负责搜索有关键字的行
2、awk print:负责打印行中的空格隔开的各个参数
3、sort:负责排序
4、uniq c:负责统计相同行的行的数目
二、上下文切换
并不是启动更多的线程,运行的更快,因为会有上下文切换以及死锁的问题和线程创建的开销。
任务从保存到再加载的过程就是一次上下文切换。上下文切换会影响多线程的执行速度。
1、如何减少上下文切换?
1、无锁并发编程:如将数据的ID按照Hash算法去摸分段,不同的线程处理不同段段数据,来避免多线程竞争锁。
2、CAS算法:Java中的 Atomic包中采用CAS算法更新,而不需要加锁。
3、使用最少线程:避免创建过多的空闲线程。
4、协程:在单线程里实现多任务的调度,在单线程里维持多任务间的切换。
三、避免死锁的方法
1、避免一个线程获取多个锁。
2、避免一个线程在锁内获取多个资源。
3、尝试使用定时锁,来替代普通的锁。
4、对于数据库锁,加锁与解锁需在一个数据库连接里。
四、总结
启动多少线程受限于计算机的硬件与软件的资源。
1、带宽的上传与下载速速。
2、硬盘的读写速度。
3、Cpu的处理速度。
4、软件方面:数据库连接数,或者socket连接数。
硬件资源可以创建机器的集群,软件方面可以使用连接池的技术,复用连接。
需要根据任务所占用的资源,合理调整并发度。
建议多使用JDK并发包提供的并发容器和工具类来解决并发问题。