在并发中有两种方式,一是多进程,二是多线程,可是线程相比进程花销更小且能共享资源。编程
线程带来的风险:安全
1. 安全性问题。错误的问题永不发生。竞态条件(顺序敏感)。多线程
2. 活跃性问题。正确的事情必定会发生。死循环,死锁。并发
3. 性能问题。正确的事情尽快发生。服务时间过长,响应不灵敏,吞吐率太低性能
定义:安全性问题的含义是“永远不发生糟糕的事情”spa
缘由:内存共享,指令重排序,并行运行,操做顺序不可预测,将会在串行编程模型中引入非串行因素,产生奇怪的结果。便利的同时有风险,很难分析。线程
常见:有一种常见的并发安全问题叫“竞态条件”。 设计
/** 一、什么是竞态条件? 当两个线程竞争同一资源时,若是对资源的访问顺序敏感,就称存在竞态条件。 致使竞态条件发生的代码区称做临界区。 在临界区中使用适当的同步就能够避免竞态条件。 临界区实现方法有两种,一种是用synchronized,一种是用Lock显式锁实现。 */
线程会致使一些在单线程程序中不会出现的问题,那就是活跃性问题。code
活跃性则关注另一个目标:“某件正确的事情最终会发生”。当某个操做没法继续执行下去时,就会发生活跃性问题。blog
在串行程序中,活跃性问题的一种就是无心中形成的无限循环,使得不能按照设计的工做进行,执行不到后面的代码。或者因为资源竞争而致使的死锁等。
活跃性意味着某件正确的事情会中会发生,但却不够好,由于咱们但愿正确的事情尽快发生。
性能问题包括多个方面,例如服务时间过长,响应不灵敏,吞吐率太低等等。
因此多线程须要良好的设计来提高线程的性能,但不管如何线程总会带来额外的开销,因为多线程之间的调度会频繁地出现上下文切换操做,保存和恢复执行上下文,线程之间共享数据时须要同步等等。