Javaの同一スレッドのインスタンス変数はスレッドセーフでない
今までDIコンテナのフレームワークしか使ったことがなかったので、Actionクラスのインスタンス変数の実体が共有されないことについて特に意識しなかった。しかし、どうやらDIコンテナでないStruts1系のActionクラスは複数スレッドで共有されるため、インスタンス変数の実体が共有されてしまうみたい。
JavaのThreadLocalとスレッドセーフについて - Qiita
*DIコンテナはHTTPリクエスト単位でActionクラスを作成しているので、Actionクラス内のインスタンス変数は共有されない。
上記を読んでいてJavaのメモリ管理について気になったので調べてみました。下記の記事が詳しいです。
Java:意外と教わる機会の少ないメモリ管理のお話 - omotenashi-mind
JavaVMにはスタック領域、ヒープ領域、パーマネント領域があり、ローカル変数はスタック領域に格納され、インスタンス変数、クラス変数はヒープ領域に格納されます。
ローカル変数が絶対的にスレッドセーフなのは、ブロック内の処理が終わると破棄されるからです。インスタンス変数はどこからも参照されなくなったときに破棄されるだけで、参照があれば破棄されません。
Struts1系の開発案件の担当になったときは、注意して実装したい。
増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編
- 作者: 結城浩
- 出版社/メーカー: SBクリエイティブ株式会社
- 発売日: 2014/02/14
- メディア: Kindle版
- この商品を含むブログ (1件) を見る