IThaiのブログ

IT関連の話題やタイに関する様々なことを書いていきます。

Javaの同一スレッドのインスタンス変数はスレッドセーフでない

今までDIコンテナのフレームワークしか使ったことがなかったので、Actionクラスのインスタンス変数の実体が共有されないことについて特に意識しなかった。しかし、どうやらDIコンテナでないStruts1系のActionクラスは複数スレッドで共有されるため、インスタンス変数の実体が共有されてしまうみたい。

JavaのThreadLocalとスレッドセーフについて - Qiita

*DIコンテナはHTTPリクエスト単位でActionクラスを作成しているので、Actionクラス内のインスタンス変数は共有されない。

上記を読んでいてJavaのメモリ管理について気になったので調べてみました。下記の記事が詳しいです。

Java:意外と教わる機会の少ないメモリ管理のお話 - omotenashi-mind

JavaVMにはスタック領域、ヒープ領域、パーマネント領域があり、ローカル変数はスタック領域に格納され、インスタンス変数、クラス変数はヒープ領域に格納されます。

ローカル変数が絶対的にスレッドセーフなのは、ブロック内の処理が終わると破棄されるからです。インスタンス変数はどこからも参照されなくなったときに破棄されるだけで、参照があれば破棄されません。

Struts1系の開発案件の担当になったときは、注意して実装したい。

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編

増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編