背景
以下でStringBuilderとStringBufferについて以下を学びました
StringBuilderの方がパフォーマンスが良い
・StringBuilder:スレッドセーフじゃない
・StringBuffer:スレッドセーフ
スレッドセーフとは何ぞや
複数のスレッドが同時に同一のデータやリソースにアクセスしたとき、予期せぬ問題やデータの不整合が発生しないように設計されたコードのことを指します。
「並行処理を行っても安全」という意味らしいです。
並行処理というのは、コンピュータが複数の処理を同時に行うことです。
つまり複数のスレッドが同時に同じデータを読み書きすると、データが予期せず上書きされたり、一部のデータが更新されないまま使われたりする可能性があり、スレッドセーフなコードは、このような競合状態を防ぐために重要であるということなんだなー
文字列に関してはスレッドセーフであるべきか
ローカル変数で用いるのであればスレッドセーフでなくても問題なさそうなのでStringBuilderでよいと思いました
ローカル変数以外は複数のスレッドから共有され得る
Javaの変数は,ローカル変数だけがスレッドセーフ(複数のスレッドが同時に動作しても異常をきたさないこと)で>ある。その理由は,ローカル変数はスレッドごとに割り振られる「Javaスタック」と呼ぶメモリー領域に格納される>からだ。これに対して共有メモリーである「ヒープ領域」に格納されるインスタンス変数やクラス変数は,複数のス>レッドが共有する可能性があり,スレッドセーフではない。そのため,参照または更新するときにはロック(更新メ>ソッドにsynchronizedキーワードを指定する)などを検討しなければならない
感想
StringBuilderを自然と使っていたけどこんな背景があるんだなーと
面白い