【发布时间】:2012-04-01 21:32:53
【问题描述】:
目前在看《Java concurrency in practice》,里面有这么一句话:
由于线程访问无状态对象的动作不会影响其他线程操作的正确性,因此无状态对象是线程安全的。
那么,什么是无状态对象?
【问题讨论】:
标签: java terminology
目前在看《Java concurrency in practice》,里面有这么一句话:
由于线程访问无状态对象的动作不会影响其他线程操作的正确性,因此无状态对象是线程安全的。
那么,什么是无状态对象?
【问题讨论】:
标签: java terminology
Stateless: it has no fields and references no fields from other classes.
特定计算的状态仅存在于存储在线程堆栈中的局部变量中,并且只能由执行线程访问。
一个线程访问一个方法/类不能影响另一个线程访问同一个方法/类的结果;因为两个线程不共享状态,就好像它们访问不同的实例一样。
Since the actions of a thread accessing a stateless object cannot
affect the correctness of operations in other threads, Stateless objects are threadsafe.
【讨论】:
简单来说,对象的状态是指该对象内部变量的值。
有状态 - 可以更改对象的状态,意味着可以更改该对象的成员变量的内部值
如何更改值?
通过设置值。
什么时候可以设置该值? 当变量不是最终的..
因此,要使类无状态,请将变量设为 final,这样该变量的值就不能在 setter 和其他方法中更改。只能用于计算。
【讨论】:
如果您不能更改对象的任何参数或值等,则在创建后,该对象是线程安全的。
【讨论】:
只是一个澄清。 您可以按照前面所述的方式将您的类视为无状态的,即使它有一个实例变量,只要该变量是最终的且不可变的。
如果实例变量只是最终的但可变的,例如一个字符串列表,是的,变量的引用不能改变,但列表的内容和类的状态可以改变。
【讨论】:
如果对象没有任何实例字段,则它是无状态。如果它有一些字段,它也可以是无状态的,但它们的值是已知的并且不会改变。
这是一个无状态对象:
class Stateless {
void test() {
System.out.println("Test!");
}
}
这也是一个无状态对象:
class Stateless {
//No static modifier because we're talking about the object itself
final String TEST = "Test!";
void test() {
System.out.println(TEST);
}
}
这个对象有状态,所以它不是无状态的。但是,它的状态只设置一次,以后不会改变,这种类型的对象称为不可变:
class Immutable {
final String testString;
Immutable(String testString) {
this.testString = testString;
}
void test() {
System.out.println(testString);
}
}
【讨论】:
无状态对象是没有实例字段(实例变量)的类的实例。类可能有字段,但它们是编译时常量(静态最终)。
一个非常相关的术语是不可变。不可变对象可能具有状态,但在调用方法时它不会改变(方法调用不会为字段分配新值)。这些对象也是线程安全的。
【讨论】:
无状态对象的概念与side effects的概念高度耦合。 简而言之,该对象下没有可以具有不同值的字段,具体取决于方法调用的不同顺序。
【讨论】:
一个完全没有状态的对象,那么重用它们就没有问题 此时的问题是:如果它们完全没有状态,为什么不将所有方法都设为静态并且根本不创建呢?
【讨论】:
无状态对象是没有任何内部状态(内部变量)的对象
【讨论】:
没有状态的对象,例如可以根据对象已经发生的事情而改变和变化的实例变量
【讨论】: