并发编程的目的是为了让程序执行的更快,而不是启动更多的线程让程序最大幅度的并发执行。
1.上下文切换
CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换。 如何减少上下文切换:无锁并发编程,CAS算法,使用最少线程,协程。 无所并发编程:多线程竞争锁时,会引起上下文切换。为了避免锁,如将数据的ID按照Hash算法取模分段,不同线程处理不同段的数据。 CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁。 使用最少线程:避免创建不需要的线程,如任务很少,但创建了许多线程,这样会导致大量线程处于等待状态。 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。 减少上下文切换方法:
// 1.将线程信息dump到home/dumpfile/dumpmsg31212文件中
sudo -u admin /opt/software/java/bin/jstack 31212 > /home/dumpfile/dumpmsg31212
// 2.统计所有线程分别处于什么状态
grep ava.lang.Thread.State dumpmsg31212 | awk '{print $2$3$4$5}' | sort | uniq -c
// 3.打开dump文件查看处于WAITING的线程在做什么
// 4.对相关问题进行对应的优化操作
2.死锁
锁是应用的比较多的一个工具,运用场景很多,使用也较为方便,且容易理解。但如果应用不当的话,很有可能会导致死锁,导致系统功能无法正常使用。 造成死锁的原因有很多种,大部分情况下可能是出现异常没有释放锁。避免死锁的常见方法有:
- a.避免一个线程同时获得多个锁。
- b.避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
- c.尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
- d.对于数据库锁,加锁和解锁必须在同一个数据库连接里,否则会出现解锁失败的情况。
3.资源限制
1.资源限制:指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。 2.引发的问题:在并发编程中,代码执行速度加快的原则是将代码中串行执行的部分改为并行执行。但如果由于资源限制,导致并发执行的代码依旧处于串行执行的状态,这时程序执行速度不仅不会变快,反而会更加缓慢,因为增加了上下文切换和资源调度的时间。 3.如何解决资源限制的问题:硬件资源限制,可以考虑使用集群并行执行程序。软件资源限制,可以考虑使用资源池将资源复用。 4.资源限制的情况下进行并发编程时,如何让程序执行的更快?方法就是根据不同的资源限制调整程序的并发度。
4.总结
对于Java开发工程师而言,强烈建议多使用JDK并发包提供的并发容器和工具类来解决并发问题。
来源:oschina
链接:https://my.oschina.net/u/2772398/blog/3009606