如果一个类的同一个实例被多个线程共享并不会使这些线程存在共享状态, 那么这个类及其任意一个实例就被称为无状态对象。无状态对象不含任何实例变量,且不包含任何静态变量或者其包含的静态变量都是只读的(常量)。
一个线程执行无状态对象的任意一个方法来完成某个计算的时候,该计算的瞬时状态(中间结果)仅体现在局部变量和(或)只有当前执行线程能够访问的对象的状态上。因此,一个线程执行无状态对象的任何方法都不会对访问该无状态对象的其他线程产生任何干扰作用。所以,无状态对象具有固有的线程安全性,它可以被多个线程共享,而这些线程在执行该对象的任何方法时都无须使用同步机制。
无状态对象具有线程安全性,这有两层含义:

  • 无状态对象的客户端代码在调用该对象的任何方法时都无须加锁 。
  • 无状态对象自身的方法实现也无须使用锁。

无状态对象不包含任何实例变量或者可更新静态变量(包括来自相应类的上层类的实例变量或者静态变量)。但是,一个类不包含任何实例变量或者静态变量却不一定是无状态对象。特殊情况下,不包含任何实例变量或者静态变量的类,其方法实现时仍然需要借助锁来保障线程安全。无状态对象的一些方法可能在代码维护过程中需要访问一些非线程安全对象,而这些对象的访问可能导致这些方法的执行线程存在共享状态