1.无锁并发编程
锁竞争会引起上下文切换,所以避免使用锁是一种办法:例如将数据进行hash,进行分段,不同线程处理不同的段上的数据。
2.CAS算法
java的Atomic包使用CAS算法来更新数据,而不需要加锁
3.使用最少线程
避免创建不需要的线程,例如任务很少,却创建了大量线程,造成大量线程处于等待状态
4.协程
在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换
5.实战例子:观察进程中的线程
使用jstack命名dump线程信息
jstack pid > dump17
统计所有线程的状态
grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5}' | sort | uniq -c
6.如何避免死锁
避免同一个线程同时获取多个锁
避免一个线程在锁内占用多个资源,尽量保证每个锁只占用一个资源
尝试使用定时锁,使用lock,tryLock(timeOut) 来代替使用内部锁机制
对于数据库锁,加锁和解锁必须在同一个数据库连接里,否则会出现解锁失败的情况
7.CAS算法(Compare And Swap)
实现轻量级的原子操作,可以使用CAS算法,java的并发框架中提供了一些Atomic工具类可以帮助完成
但CAS算法存在三个问题:ABA问题,循环时间长开销大,只能保证一个共享变量的原子操作