0

私は Java を初めて使用し、Java 言語を読んでいるときに 2 つの疑問に思いました。私は多くのウェブサイトを参照しましたが、それでも私はあまり明確ではありません.

  1. 文字列クラスが不変なのはなぜですか? セキュリティの脅威につながる例をいくつか見ましたnew File(str)が、文字列が不変である場合、このシナリオにどのように役立つかわかりません。

  2. もう 1 つの疑問は、wait、notify、notifyall が同期ブロック内にある必要がある理由です。そうでない場合は、それがスローされることを知っていillegalMonitorExceptionます。しかし、なぜそれが同期ブロックにある必要があるのか​​ 、同期ブロック待機なしではなく、通知が同じ動作をすることができるのかという技術的背景を知りたいです。

4

1 に答える 1

1

文字列クラスが不変なのはなぜですか?

なぜ Java で文字列が不変なのかという問題は古くからあり、多くの議論がなされてきました。私の本では、不変でなければならないので、不変であると言います;)。警官のように聞こえるかもしれませんが、説明させてください。

最も簡単に言えば、文字列が可変である場合、防御的なコピーを作成したり同期を処理したりするためにどこでも多くの荷物が必要になる場合、文字列はいたるところで使用されます。それらを不変にし、StringBuilder/StringBuffer のようにそれらを変更するためのヘルパーを持つことは、はるかに優れた設計上の選択です (Java だけでなく、いくつかの言語で一般的な選択です)。

第二に、可変性を正当化する正当な理由がない限り、すべてが不変であるべきです。多くの問題は、不変クラス (特に並行性に関連するもの) で解消されます。効果的な Java を参照してください: 「クラスを可変にする非常に正当な理由がない限り、クラスは不変であるべきです。クラスを不変にできない場合は、可能な限りその可変性を制限してください。」

第 3 に、文字列はクラス ローディング メカニズムなど、Java の内部で使用されます。それらを不変にすることで、内部プロセスが単純になり、いくつかのセキュリティ問題が防止されます。(別の例として、Java ではパフォーマンス上の理由から文字列定数が「インターン化」されています: http://en.wikipedia.org/wiki/String_interning 。これもまた、不変型を使用するとより正気になります。)

全体として、設計者が Java で文字列を不変にすることを選択した理由はおそらくいくつかあり、日々のプログラマーとして役立ちます (StringBuilder などの新しい文字列の作成に関するユーティリティと同様)。

なぜwait、notify、notifyallが同期ブロック内にある必要があるのですか?

これに関する情報は次のとおりです

基本的に、オブジェクトのモニターをすでに所有していない限り、スレッドが「通知」または「待機」することは意味がありません。

ただし、一般に、Java を初めて使用する場合は、java.util.concurrent の同時実行性に関連するいくつかの新しいユーティリティも参照することをお勧めします: http://docs.oracle.com/javase/6/docs/api /java/util/concurrent/package-summary.html . 多くの場合、これらのクラスに依存することで、手動コーディングによる同期を回避できます。これは、困難でエラーが発生しやすいことで知られています。

于 2013-03-04T20:54:57.177 に答える