并发编程实战(1)—进程、线程

进程:

  计算机通过加入操作系统来实现多个程序的同时执行:操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行,操作系统为各个独立的进程分配各种资源(如内存、文件句柄等)

线程:

  促使进程出现的因素同样也促使着线程的出现:

  线程允许在同一个进程中同时存在多个程序控制流,线程会共享进程范围内的资源,但每个线程都有各自的程序计数器、栈、以及局部变量等,同一个程序中的多个线程也可以被同时调度到多个CPU上运行。由于同一个进程中的所有线程都将共享进程的内存地址空间,因此这些线程都能访问相同的变量并在同一堆上分配对象。

  线程也叫轻量级进程,现代操作系统,大多数都是以线程为基本的调度单位,而不是进程。如果没有明确的协同机制,那么线程将彼此独立运行。


线程带来的问题:

  安全性问题:

    要使多线程程序的行为可以预测,必须对共享变量的访问操作进行协同

  性能问题:

    在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另一个线程时,就会频繁的出现上下文切换操作(Context Switch),这种操作将带来极大的开销:保存和恢复执行上下文,丢失局部性,并且CPU时间将更多的花在线程调度而不是线程运行上

常见线程问题:

  JVM:在JVM启动时,将为JVM的内部任务(如:垃圾收集、终结操作等)创建后台线程,并创建一个主线程来运行main方法。

  Servlet / JSP:Servlet框架用于部署web应用程序以及分发来自HTTP客户端的请求,每个Servlet都表示一个逻辑组件。在Servlet开发规范中,Servlet需要满足被多个线程同时调用,Servlet需要是线程安全的。

  RMI:RMI是代码能够调用在其他JVM中运行的对象,当通过RMI调用某个远程方法时,传递给方法的参数必须被打包(也称列集)到一个字节流中,通过网络传输给远程JVM,然后由远程JVM拆包(散集)并传递给远程方法。RMI对象也要做好被多个线程同时调用的准备,确保它们自身的线程安全性。

  

原文地址:https://www.cnblogs.com/pluto-yang/p/12570836.html