5

質問は、Java の SimpleDateFormat クラスに関するものです。私はそのドキュメントを読みました

日付形式は同期されません。スレッドごとに個別のフォーマット インスタンスを作成することをお勧めします。複数のスレッドが同時にフォーマットにアクセスする場合は、外部で同期する必要があります。

明らかに、私はそれによって最もあいまいな方法で打たれた後にそれを読みました.

たとえば、「フォーマット」メソッドによってアクセスされるクラスメンバーの状態情報が必要な理由を知っている人はいますか?

それはある種の速度の最適化ですか?正当な理由が思いつきませんでした。

4

2 に答える 2

8

あなたの答えはほとんどここにあります:

/* * (C) Copyright Taligent, Inc. 1996 - 無断複写・転載を禁じます

1.4 hotspot 以前は、Java でマルチスレッド コードを書くことは、主に大学院生の宿題でした。この言語は、Web アプリケーション サーバーが本格的に登場し、コンテナ駆動の高度な同時実行システムが台頭する 10 年ほど前のことでした。

1996 年、ガベージ コレクションは非常に遅く苦痛を伴うプロセスであり、通常、発生中に UI が一時停止し、動かなくなったように見えました。同様に、新しいオブジェクトを作成することは非常にコストがかかると考えられていました (Windows 95 と格闘しているときに連続したメモリ領域を作成することは、 L2 CPU キャッシュなしで 4MB の物理メモリを共有するには、しばらく時間がかかります.....)。

したがって、マルチスレッディングが非常にまれで、メモリが貴重な環境では (平均的なユーザーはおそらく 8MB または 4MB のシステム メモリを搭載した 486 または Pentium 1 を使用しています...)、 - Calendar の単一のインスタンスを可能な限り使用します。Calendar 自体は不格好な獣のようなものです。

今日、私たちは、そのようなクラスがステートフルであることがどれほど恐ろしい慣習であるかを嘲笑することができますが、当時の正しい選択として簡単に擁護することもできます。

Sun の 100% 下位互換性への執着を擁護し、それを更新しないことは当然のことです。

于 2012-09-27T18:47:39.670 に答える
1

パフォーマンス上の理由で行われているようです。それ以外の説明はありません。

それがどのように機能するかについての良い要約がここにあります: Why is Java's SimpleDateFormat not thread-safe?

于 2012-09-27T18:15:50.887 に答える