多线程的风险漫谈

线程的风险java

Java对线程内置支持是一把双刃剑。它经过提供语言和类库,以及一个规范的跨平台存储模型,简化了并发应用的开发。这样作同时提升了开发人员门槛,由于更多的程序须要使用线程,主流的开发人员都必须知道线程安全性的问题。web

并发危险:竞争条件(race condition)。由于线程共享相同的内存地址空间,且并发的运行,它们可能访问或修改其余线程正在使用的变量。这其中存在着巨大风险,当数据之外改变时,线程会出现混乱。给顺序编程模型引入了一些非顺序因素,这可能形成混乱,而且难以发现错误的缘由。为了使多线程程序的行为可预见,访问共享变量必须通过合理的协调,这样线程才不会相互干扰。Java提供了同步机制来协调这样的访问。编程

活跃度的危险:活跃度失败(liveness failure)。当一个活动进入某种它永远没法继续执行的状态时,活跃度失败就发生了。包括死锁(dead lock)、饥饿(starvation)、活锁(livelock)。缓存

性能危险: 性能问题包括服务时间、响应性、吞吐量、资源消费或者可伸缩性安全

的不良表现。设计良好的应用使用线程,可以得到纯粹的性能收益,可是线程会给运行时带来必定程序的开销。上下文切换(Context switches)——当调度程序临时挂起当前运行的线程时,另外一个线程开始运行——这在多个线程组成的应用程序中是很频繁的,而且带来巨大的系统开销;保存和恢复线程执行的上下文,离开执行的现场,而且CPU的时间会花费在对线程的调度上。当线程共享数据的时候,它们必须使用同步机制,这个机制会限制编译器的优化,可以清空或锁定内存和高速缓存,并在共享内存总线上建立同步通讯。这些因素引入了新的性能开销。微信

 

线程安全多线程

编写线程安全的代码,本质上就是管理对状态(state)的访问,并且一般都是共享(一个变量能够被多个线程访问)、可变(变量的值在其生命周期内能够改)的状态。并发

什么是线程安全性能

当多个线程访问一个类时,若是不用考虑这些线程在运行时环境下的调度和交替执行,而且不须要额外的的同步及在调用方代码没必要做其余的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的。优化

无状态的对象永远是线程安全的。

原子性:假设有操做A和操做B,若是从执行A的线程角度看,当其余线程执行B时,要么B所有执行完成,要么一点都没有执行,这样A和B互为原子操做,一个原子操做是指,该操做对于全部的操做,包括它本身,都知足前面描述的状态。

锁:java 提供了强制原子性的内置锁机制:synchronized块。它包括两部分:锁对象引用,以及这个锁保护的代码块。由于锁使得线程可以串行地(serialized)访问它所保护的代码路径,因此咱们能够用锁建立相关的协议,以保证线程对共享状态的独占访问。只要始终如一的遵循这些协议,就可以确保状态的一致性。

本文首发于我的微信公众号:webguan ;欢迎您的关注

相关文章
相关标签/搜索