并发编程 安全、活跃性、性能问题
本文将介绍并发编程中的安全、活跃性、性能问题。
一、安全问题
产生安全问题的本质原因是:存在共享数据且该共享数据会被多个线程同时写。
需要注意的点是:考虑可见性问题、原子性问题、有序性问题。
二、活跃性问题
所谓活跃性问题,是指某个操作无法向下执行(不活跃)。
常见的活跃性问题有:
死锁:一组线程,每一个线程都在等待只能由其它线程引发的事件,结果就是所有线程都阻塞了
具体请看:
活锁:线程并没有阻塞,但由于某些原因没有满足,导致一直重复 “尝试 - 失败 - 等待 - 尝试” 的过程
可以这样类比:路人甲从左手边出门,路人乙从右手边进门,两人为了不相撞,互相谦让,路人甲让路走右手边,路人乙也让路走左手边,结果是两人又相撞了。
解决活锁的方法很简单,等待时不应该等待固定时间,而是应该等待随机时间,这样就增加了避开冲突的可能性。
饥饿:线程因无法访问所需资源而无法执行下去
解决饥饿问题的三种方案是:
保证资源充足
保证公平分配资源
使用公平锁
避免资源被长时间占据
三、性能问题
锁的过度使用可能导致串行化的范围过大,从而不能发挥多线程的优势。
参考
- Java 并发编程实战