私のクラスでは、私の「タスク」クラスのように動作するコードを以下に示します。私は、このクラスのインスタンスを複数作成し、threadpool
JavaでDTOオブジェクトを使用するときのスレッドの安全性
class Task {
public void doJob() {
String s = informationDto.getName();
}
}
DTOに渡します:私はinformationDto.getName();
声明について疑問に思って
class InformationDto{
private String name;
public getName(){}
public setName(String n){}
}
。マルチスレッド環境では常に正しい名前が返されますか?
getName()
方法は静的なものである場合、何が起こりますか?
私が作成していますすべてのTask
クラスのinformationDto
それぞれを使用します。これを行う最善の方法は何でしょうか?
1)Task
クラスごとに1つずつInformationDto
とします。 2)インスタンス変数はスレッドセーフではないので、私はTask
クラスに設定した正しい名前を得ることができるでしょうか?getName()
メソッド(name
はインスタンス変数です)にアクセスすればいいのですか? 3)スレッドセーフなクラスであるTask
クラスの中でutilクラスを使用するのと同じですか?スレッドセーフな方法でutilのインスタンスの種類を使用する方法はありますか?私はまだ正確にあなたの問題について明確が、コメントで言っただけでは不十分だ
"正しい名前"とはどういう意味ですか?誰かが 'setName()'を同じインスタンス上で並列に呼び出すでしょうか? 'InformationDTO'が不変である必要がありますか?あなたの質問に合うかもしれないいくつかの答えがありますので、多少の背景を与えるでしょうか? –
'InformationDto'は不変クラスではありません。それは普通のDTOです。だから私はどのようにスレッドセーフな方法でそのDTOを使用することができますか?つまり、 'Task'クラスのメソッド変数でそれを使用しているので、スレッドセーフなのでしょうか?私は 'doJob'メソッドの中で' DTO'のインスタンス変数にアクセスしているからです。 – Sam
スレッドセーフとは、予期しない同時変更が発生しないことを意味します。別のスレッドがコレクションを変更している間、コレクションを反復するようなものです。あなたの場合、 'setName()'がそれを変更できる間、 'getName()'は内部状態を返します。誰かが新しい文字列の半分と古い文字列の半分を持っているように、それを更新している人の途中でその状態を部分的に読むことはできませんが、 'setName() '。それで私の質問。あなたはどんなふうに行動しますか?この文脈であなたにとってスレッドセーフであることを定義してください –