欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第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并发包提供的并发容器和工具类来解决并发问题。