静的フィールドを持つコードがありますval format = DateTimeFormatter.forPattern("yyyy-MM-dd")
。これで、フォーマッタのこのインスタンスは、同時実行スレッドによって使用され、日付format.parseDateTime("2013-09-24")
とが解析および出力されますformat.print(instant)
。Scala では、不変フィールドのみを使用すれば、並行性を気にせずにコードを記述できることを学びましたが、パフォーマンスはどうでしょうか? 複数のスレッドが同じインスタンスを使用すると、ボトルネックになる可能性はありますか?
ありがとう、
2 に答える
あなたの質問はJavaに関連しています。メソッドの実装forPattern
がスレッドセーフである場合、ボトルネックなしで多くのスレッド間で共有できます。
javadoc をチェックして、実装がスレッドセーフかどうかを確認してください。あなたの特定のケースでは、あなたがJodaTimeライブラリを使用していると仮定します:
DateTime Javadocから抽出:
DateTimeFormat はスレッドセーフで不変であり、それが返すフォーマッタも同様です。
SimpleDateFormat javadocを参照してください:
日付形式は同期されません。スレッドごとに個別のフォーマット インスタンスを作成することをお勧めします。複数のスレッドが同時にフォーマットにアクセスする場合は、外部で同期する必要があります。
val を使用するということは、宣言後に変数参照が変更されないことを意味します。Scala での var 定義と val 定義の違いは何ですか? を参照してください。
あなたはそれを誤解しているように見えます.Scalaの並行性はJava(または他の言語)に非常に似ており、特別なことは何もありません. 代わりのライブラリとシンタックス シュガーを提供することで、はるかに少ないボイラー プレートでそれらを実行でき、さらに重要なことに安全に実行できます (例: akka)。
ただし、コア数、スレッドプールサイズ、コンテキストスイッチなどへの依存など、他の原則はすべて処理して処理する必要があります。
ここで、複数のスレッドによってアクセスされるイミュータブルval
がパフォーマンスを低下させるかどうかについて質問します。オーバーヘッドがあるべきではないと思いますし、サポートするデータもありません。しかし、プロセッサがそれをキャッシュでき、同じオブジェクトを別のコアでより速く取得できるため、パフォーマンスは良いかもしれないと思います.