多线程的挑战

原创
2016/08/27 09:50
阅读数 82

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

2、单核处理器同样可以运行多线程,这个时候CPU通过给每个线程分配CPU时间片来实现这个机制,因为时间片非常短,所以线程之间的切换是宏观无法感知,微观上来讲还是串行的,这就是宏观并行,微观串行。如果线程数远远大于CPU核心数,那么不同的线程与线程之间需要相互切换来获取CPU资源,所以这是非常耗时的,因此资源受限的情况,并行并不一定由于串行。

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

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

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

6、避免死锁的几种方法:

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

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

3)尽量使用定时锁,lock.tryLock(timeout) ,超时之后自动释放锁,根据业务决定

7、其他硬件和软件资源的限制

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

2)IO读写速度

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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部