5

プログラマーのテストから次のコードを取得しました

private String formatDate(Date date)
{
  String result = "";
  //….
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  result = sdf.format(date);
  //…
  return result;
}

複数のスレッドが一度にメソッドを使用しているという追加情報とともに。これに問題はありますか?

私の答えは、いいえ、問題ないはずです (//... の部分で他に何も起こっていないと仮定して)。

私の動機は、グローバルまたはクラスのデータ構造が使用されていないことです。日付は各トレッドからパラメーターとして渡され、メソッド内ではローカル変数とローカル オブジェクトのみが使用されます。したがって、各スレッドは、SimpleDateFormat クラスの独自のオブジェクト インスタンスを取得して使用します。

しかし、これはテストの「正解」ではありませんでした。「正しい」答えは、クラス SimpleDateFormat はスレッド セーフではないため、そのオブジェクトへのアクセスを同期する必要があるということです。

それで、私または解決策は正しいですか?

4

2 に答える 2

8

あなたの答えは正しいです。SimpleDateFormat はスレッドセーフではありませんが、メソッド呼び出しごとに独自のインスタンスが作成されるため、これで問題ありません。SimpleDateFormat がインスタンス変数である場合、これはスレッドセーフではありません (前述のとおり)。

于 2012-11-16T09:57:48.517 に答える
3

SimpleDateFormatterこれは問題ではありません。これはローカル変数であり、外部に公開されていないため、複数のスレッドからアクセスすることはできません。本当の問題はDateパラメータです(@Marko Topolnikがすでに言ったように)。このオブジェクトは、メソッドといくつかのスレッドに渡すことができ、formatDateメソッドの実行中に変更することができます。longデータレースを防ぐためのパラメータタイプとして使用できます。useメソッドに変換Dateし、そこから作成するには、コンストラクターを使用できます。longDate.getTime()Datelongnew Date(long)

于 2012-11-16T10:12:53.670 に答える