現在、私は次の文を含む「Java concurrency in practice」を読んでいます:
ステートレスオブジェクトにアクセスするスレッドのアクションは、他のスレッドでの操作の正確さに影響を与えないため、ステートレスオブジェクトはスレッドセーフです。
それで、ステートレスオブジェクトとは何ですか?
ステートレスオブジェクトは、インスタンスフィールド(インスタンス変数)のないクラスのインスタンスです。クラスmayにはフィールドがありますが、それらはコンパイル時の定数(静的最終)です。
非常に関連する用語はimmutableです。不変オブジェクトは状態を持つことができますが、メソッドが呼び出されても変化しません(メソッド呼び出しはフィールドに新しい値を割り当てません)。これらのオブジェクトもスレッドセーフです。
オブジェクトにインスタンスフィールドがない場合、それはステートレスです。また、フィールドがある場合はステートレスになりますが、値は既知であり、変更されません。
これはステートレスオブジェクトです。
class Stateless {
void test() {
System.out.println("Test!");
}
}
これもstatelessオブジェクトです。
class Stateless {
//No static modifier because we're talking about the object itself
final String TEST = "Test!";
void test() {
System.out.println(TEST);
}
}
このオブジェクトには状態があるため、notステートレスです。ただし、状態の設定は1回のみであり、後で変更されることはありません。このタイプのオブジェクトはimmutableと呼ばれます。
class Immutable {
final String testString;
Immutable(String testString) {
this.testString = testString;
}
void test() {
System.out.println(testString);
}
}
状態のないオブジェクト。インスタンス変数のように、オブジェクトにすでに起こったことに応じて変化したり変化したりできます。
ステートレスオブジェクトの概念は、 副作用 の概念と高度に結びついています。まもなく、それは、メソッド呼び出しの異なる順序に応じて異なる値を持つことができるフィールドを下に持たないオブジェクトです。
ただ明確化。この変数が最終AND不変である限り、インスタンス変数がある場合でも、前述の方法でクラスをステートレスと見なすことができます。
インスタンス変数が最終的なだけで可変の場合、たとえば文字列のリストの場合、はい、変数の参照は変更できませんが、リストの内容、したがってクラスの状態は変更できます。
ステートレスオブジェクトとは、内部状態(内部変数)を持たないオブジェクトです。
簡単に言えば、オブジェクトの状態とは、そのオブジェクトの内部変数の値を意味します。
ステートフル-オブジェクトの状態を変更でき、そのオブジェクトのメンバー変数の内部値を変更できることを意味します
どのように値を変更できますか?
値を設定することにより。
いつその値を設定できますか?変数が最終ではない場合..
したがって、クラスをステートレスにするには、変数をfinalにして、その変数の値がセッターでも別のメソッドでも変更されないようにします。コンピューティングにのみ使用できます。
状態がまったくないオブジェクトは、この時点でオブジェクトを再利用しても問題はありません:状態がまったくない場合、なぜすべてのメソッドを静的にしてまったく作成しないのですか?
オブジェクトのパラメーターや値などを作成後に変更できない場合、そのオブジェクトはスレッドセーフです。