Javaのメモリ共有の仕組みについて教えてください。
privateなどで宣言されたようなヒープ領域にある変数について、スレッドセーフの仕組になっていない場合はメモリ共有(データの書き換え)などが起こり得ると思いますが。
いったい、どのような仕組なのでしょうか。
クラスAにprivateで宣言したA'というオブジェクトがあった場合、A'はヒープ領域に割り当てられると思います。
その後、他のスレッドでもクラスAでの動作があり、A'がヒープ領域に割り当てられる場合、もちろんアドレスは最初に割り当てられたところとは違う箇所に割り当てられますよね?
それでも、書き換えが起こるということは、Javaのなかでスレッド毎に割り当てたアドレスを管理出来てないのでしょうか?
「えーっと、A'のアドレスどこだっけ。あ、ここにA'のオブジェクトがある、きっとここかな。」みたいな感じで間違え得るのでしょうか。
それとも、アドレスを単に間違えるだけではない理由があるのでしょうか。
もし、参考になるようなネットのサイト等も教えて頂けると助かります。
宜しくお願いします。
回答を受け、少し追記します。
・インスタンスはスレッド毎にできます。
・「private オブジェクト名 変数名;」で宣言した変数がデータの書き換えが起こっています。
・メインメソッドをsynchronizedにするとか、上記変数をローカル変数にするとかすれば治ります。
ただ、なぜインスタンスは別なのに起こるのかと思ってまして。
以前、springを使ったときにscopeをprototypeにしたときは問題なかったと思っており、結局インスタンスは別になるのに何が違うんだろうと。
(ここの解釈自体が間違えているのかもしれませんが。)

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/04/22 01:55
2015/04/22 02:11
2015/04/22 02:31
2015/04/22 02:36
2015/04/22 02:43
2015/04/22 03:52
2015/04/22 05:29
2015/04/22 08:12
2015/04/22 09:08
2015/04/22 09:51
2015/04/22 10:05
2015/04/22 10:18
2015/04/23 00:01