并发编程的目的是为了让程序执行的更快,而不是启动更多的线程让程序最大幅度的并发执行。java
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.对相关问题进行对应的优化操做
锁是应用的比较多的一个工具,运用场景不少,使用也较为方便,且容易理解。但若是应用不当的话,颇有可能会致使死锁,致使系统功能没法正常使用。 形成死锁的缘由有不少种,大部分状况下多是出现异常没有释放锁。避免死锁的常见方法有:数据库
- a.避免一个线程同时得到多个锁。
- b.避免一个线程在锁内同时占用多个资源,尽可能保证每一个锁只占用一个资源。
- c.尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
- d.对于数据库锁,加锁和解锁必须在同一个数据库链接里,不然会出现解锁失败的状况。
1.资源限制:指在进行并发编程时,程序的执行速度受限于计算机硬件资源或软件资源。 2.引起的问题:在并发编程中,代码执行速度加快的原则是将代码中串行执行的部分改成并行执行。但若是因为资源限制,致使并发执行的代码依旧处于串行执行的状态,这时程序执行速度不只不会变快,反而会更加缓慢,由于增长了上下文切换和资源调度的时间。 3.如何解决资源限制的问题:硬件资源限制,能够考虑使用集群并行执行程序。软件资源限制,能够考虑使用资源池将资源复用。 4.资源限制的状况下进行并发编程时,如何让程序执行的更快?方法就是根据不一样的资源限制调整程序的并发度。编程
对于Java开发工程师而言,强烈建议多使用JDK并发包提供的并发容器和工具类来解决并发问题。多线程