は、Java
答えて
私は、なぜ新しいタブをクリアするのか分かりません。
これは単なるローカル変数です。
は、私は、次の3つの理由を考えることができます。
可読性、@Bheshグルンによって示唆されているように...それはほとんどここで(IMO)違いはありませんけれども。
あるスレッドが
clear()
を呼び出している間に発生するダメージを緩和する可能性がありますが、2番目のスレッドはテーブルを拡張する可能性のある更新を行います。しかし、それは確かに問題を解決しないので、私はこれが無意味であると却下する傾向があります。パフォーマンスが向上することがあります。例えばローカル変数
tab
の参照が変更できないことをオプティマイザが認識しているため、配列境界チェックを最適化することができます。
これらのうち、第3の理由がもっともらしいと思います。
(私はtransient
修飾子とは何かではないと思います。この場合、修飾子は、読みやすくするためにのみ存在している。HashMap
クラスはtransient
修飾議論の余地をレンダリングreadObject
とwriteObject
を提供します。)
table
フィールドがtransient
と宣言されている可能性があります。そのため、HashMapオブジェクトの永続状態の一部ではありません。 table
フィールドは、resize()
のようなメソッドで置き換えられます。これは同期化されないため、clear()
メソッド呼び出し内のすべてのエントリを反復処理するときにtable
フィールドをスワップすることができます。最初にtable
への参照を行い、その参照を繰り返した場合、table
フィールドが変更されても、元のtable
を繰り返し処理していることが保証されます。
しかし、再び 'HashMap'は「通常」の操作ではスレッドセーフではありません。なぜ' clear() 'でそれが気になるでしょうか? –
@JoachimSauerあるスレッドにエントリを追加すると、別のスレッドが 'clear()'を呼び出した直後に 'resize()'が呼び出されます。これにより、 'clear()'コールが新しい 'table'が作成されている間にすべての古いエントリをnullに設定します。それ以外の場合、最悪の場合、追加したばかりのエントリを除いてすべてのnullのHashMapが終了する可能性があります。 –
スレッドの安全性がどのように優れているか理解しています。しかし、私が言っていることは、 'put'だけではスレッドセーフではないということです(複数のスレッドが呼び出すと、厄介なことが起こる可能性があります)。それでは、なぜ他のメソッドがスレッドセーフなのか気になるのでしょうか? –
- 1. のJava、JavaでははBouncyCastle
- 2. JavaシリアルJavaでは
- 3. Javaは、JavaでカサンドラNoHostAvailableExceptionに
- 4. エラーテリアのJavaは、Javaのサンプルコード
- 5. JavaはJavaでのJLabel
- 6. のJavaは、Java 1.8.0 で%
- 7. Javaは
- 8. は、Java
- 9. は、java
- 10. は、java
- 11. は、java
- 12. は、java
- 13. は、Java
- 14. は、Java
- 15. は、java
- 16. は、Java
- 17. Javaは
- 18. は、Java
- 19. は、java
- 20. は、Java
- 21. は、java
- 22. は、Java
- 23. は、Java
- 24. は、Java
- 25. は、Java
- 26. は、java
- 27. は、Java
- 28. は、Java
- 29. は、Java
- 30. は、java
おそらく読みやすくするためです。 –