上下文切换 死锁

多线程的挑战

北城余情 提交于 2019-12-05 17:48:51
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) ,超时之后自动释放锁