1、多线程目的:
让程序运行更快
2、并发挑战:
a、上下文切换:cpu通过时间片分配算法循环执行任务,当前任务执行一个时间片后会切换到下一个任务。任务从保存到再加载的过程就是一次上下文切换
$vmstat 1
解决:
CAS算法(重点)
使用最少线程:避免创建不要的线程,比如任务很少,倒是创建了很多线程来处理,这样会造成大量线程都处于等待状态。
sudo -u admin /opt/ifeve/java/bin/jstack pid > /home/tengfei.fangtf/dump17 转成dump信息
b、死锁问题:比如t1拿到锁之后,因为一些异常情况没有释放锁(死循环)。又或者是t1n拿到一个数据库锁,释放锁的时候抛出了异常,没释放掉。
查看dump文件确定 blocked waiting to lock
避免死锁的几个常用方法:
避免一个线程同时获取多个锁
避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制
对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。
c、资源限制的挑战:下载速度,硬盘读写速度,cpu处理速度,数据库连接数,socket连接数等。
解决:根据不同的资源限制调整程序的并发度。