多线程的挑战

一、并发不必定会快于串行,由于并发受限于不少因素,这些因素主要有:上下文切换,死锁,硬件资源(CPU核心数),软件资源(锁的数量)。算法

二、单核处理器一样能够运行多线程,这个时候CPU经过给每一个线程分配CPU时间片来实现这个机制,由于时间片很是短,因此线程之间的切换是宏观没法感知,微观上来说仍是串行的,这就是宏观并行,微观串行。若是线程数远远大于CPU核心数,那么不一样的线程与线程之间须要相互切换来获取CPU资源,因此这是很是耗时的,所以资源受限的状况,并行并不必定因为串行。数据库

三、测试上下文切换可以使用 Lmbench3 vmstat jstack 等工具命令查看。编程

四、减小上下文切换能够经过 无锁并发编程,CAS算法,使用最少线程(这个很难衡量,只是一个相对概念,由于线程太多,资源太少,致使大量线程等待,性能反而不乐观)。多线程

五、死锁致使并发程序出现不可用。两个线程t1,t2,程序运行时t1拥有锁1,与此同时,t2拥有锁2,这个时候t1想要继续运行而且想要获取锁2,那么t1必须等待t2释放锁2,但是t2线程也正须要获取锁1线程才能运行完,那么t2就要等等t1释放锁1.这样t1和t2相互等待,造成死锁。并发

六、避免死锁的几种方法:工具

1)避免在一个线程内同时获取多个锁性能

2)避免一个线程在锁内同时还去占用其余锁测试

3)尽可能使用定时锁,lock.tryLock(timeout) ,超时以后自动释放锁,根据业务决定线程

七、其余硬件和软件资源的限制资源

1)多线程下载也会受到宽带大小的限制

2)IO读写速度

3)数据库链接数,Socket链接数等,受限的资源也是影响并发的一个因素。

相关文章
相关标签/搜索