第1章,并发编程的挑战

一、几个好用的命令

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

扫描二维码关注公众号,回复: 10001553 查看本文章
发布了95 篇原创文章 · 获赞 32 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/jiangxiulilinux/article/details/104851833