并发编程 安全、活跃性、性能问题

本文将介绍并发编程中的安全、活跃性、性能问题。

一、安全问题

产生安全问题的本质原因是:存在共享数据且该共享数据会被多个线程同时写。

需要注意的点是:考虑可见性问题、原子性问题、有序性问题。

二、活跃性问题

所谓活跃性问题,是指某个操作无法向下执行(不活跃)。

常见的活跃性问题有:

  • 死锁:一组线程,每一个线程都在等待只能由其它线程引发的事件,结果就是所有线程都阻塞了

    具体请看:

    并发编程 死锁

  • 活锁:线程并没有阻塞,但由于某些原因没有满足,导致一直重复 “尝试 - 失败 - 等待 - 尝试” 的过程

    可以这样类比:路人甲从左手边出门,路人乙从右手边进门,两人为了不相撞,互相谦让,路人甲让路走右手边,路人乙也让路走左手边,结果是两人又相撞了。

    解决活锁的方法很简单,等待时不应该等待固定时间,而是应该等待随机时间,这样就增加了避开冲突的可能性。

  • 饥饿:线程因无法访问所需资源而无法执行下去

    解决饥饿问题的三种方案是:

    • 保证资源充足

    • 保证公平分配资源

      使用公平锁

    • 避免资源被长时间占据

三、性能问题

锁的过度使用可能导致串行化的范围过大,从而不能发挥多线程的优势。

参考

  • Java 并发编程实战