并发编程实战(1):线程安全性之有状态和无状态对象

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wen_fei/article/details/84104717

进程和线程的区别

  • 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
  • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.
  • 进程在执行过程中拥有独立的内存单元,进程有独立的地址空间, 而多个线程共享内存,从而极大地提高了程序的运行效率。

进程有单独的地址空间,包括:

  • 文本域(text region): 存储处理器执行的代码
  • 数据区域(data region): 存储变量和进程执行期间使用的动态分配的内存
  • 堆栈(stack region): 存储活动过程调用的指令和本地变量

线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间。一个线程包含一下内容:

  • 一个指向当前被执行指令的指令指针
  • 一个栈
  • 一个寄存器值的集合,定义了一部分描述正在执行线程的处理器状态的值
  • 一个私有的数据区

线程安全性

当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的—《并发编程实战》

定义比较宽泛,单线程程序也可以看做多线程程序。一般来说,线程安全问题都是由全局变量以及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

关于线程安全

  • 常量始终是线程安全的,因为只存在读操作
  • 每次调用方法前都新建一个实例是线程安全的,因为不会访问共享的资源。(所谓的单例模式)
  • 局部变量是线程安全的。因为每执行一个方法,都会在独立的空间创建局部变量,它不是共享的资源。局部变量包括方法的参数变量方法内变量

有状态和无状态对象

无状态对象一定是线程安全的,线程安全不一定是无状态对象。

有状态和无状态

  • 有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。即可以被共享且可变的数据。

  • 无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。它既不包含任何域,也不包含任何对其他类中域的引用。

猜你喜欢

转载自blog.csdn.net/wen_fei/article/details/84104717