- 締切済み
Java Stringに関して
お世話になります。 SJC-Pの学習をしているのですが、Stringに関して、とある教科書に 以下のように記述されていましたが意味がわかりません。 わかりやすく教えていただけたらと思います。 教科書の文章(以下) 同じリテラル文字列に再び出会った場合、コンパイラは既にプール内 に格納されている文字列を使います。(3つ以上の参照変数が同じ 文字列を参照する可能性があるため、この処理はスレッドセーフ ではない。) 上記文章の( ) で囲まれた部分の意味がまったくわかりません。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- choconamacream
- ベストアンサー率44% (152/338)
#1です。あれからいろいろと自分でも考えてみたんですが,よく分からなかったです。(もしかしたら、#1のソースも全然、関係ないかも。) 「スレッドセーフ」という言葉は、SJC-Pの出題範囲内では他でもコレクションの項目などで出てきたりしますが、それは該当するコレクションクラス内のメソッドがsynchronizedになっているということであって、Stringの等価・不等価とはあまり関連性がないように思われます。 恐らく、その教科書の記述の近くに、該当する部分を実装したソースが載っているのではないかと思い、似たようなソースを提示してみたのですが、質問者さんが関係ないとお思いでしたら、全く的外れな回答だったと思います。
- hejaheja
- ベストアンサー率0% (0/0)
複数ある参照先のいずれかで データの書き換え等が発生した場合に 想定外のデータが入ってしまう String hoge1 = "aaaa"; String hoge2 = "aaaa"; String hoge3 = "aaaa"; hoge1~3の "aaaa" は1箇所のアドレスに存在しているため たとえばhoge1が"bbbb"に書き換えられた場合 hoge2、hoge3の値まで書き換わってしまい hoge2、hoge3では想定外のデータが取得できてしまう。 つまり”スレッドセーフではない”ってこと。たぶん。
- choconamacream
- ベストアンサー率44% (152/338)
/** 「スレッドセーフ」については、マルチスレッドの所に詳しく書かれていると思うので、そちらを勉強するまでいったん棚上げしておくのも、効率的な勉強法の一つ。 */ public class Safe{ public static void main(String[] args){ // 暗黙的にnewするのは、最初のみ。 String str_1 = "1つ目"; String str_1_1 = "1つ目"; // ヒープ内の同じオブジェクトを代用。 String str_1_1_1 = "1つ目"; // ヒープ内の同じオブジェクトを代用。 String str_1_1_1_1 = "1つ目"; // ヒープ内の同じオブジェクトを代用。 // 同じオブジェクトかどうかの比較の為に、==を使用。 // equalsメソッドは、文字列の比較の時に使う。 if(str_1 == str_1_1 || str_1 == str_1_1_1 || str_1 == str_1_1_1_1){ System.out.println("3つ以上の参照変数が、同じ文字列を参照する可能性あり。"); }else{ System.out.println("スレッドセーフです。"); } // 毎回、明示的にnewします。 String str_2 = new String("2つ目"); String str_2_2 = new String("2つ目"); String str_2_2_2 = new String("2つ目"); String str_2_2_2_2 = new String("2つ目"); if(str_2 == str_2_2 || str_2 == str_2_2_2 || str_2 == str_2_2_2_2){ System.out.println("3つ以上の参照変数が、同じ文字列を参照する可能性あり。"); }else{ System.out.println("スレッドセーフです。"); } } }
補足
すみません。まったく意味がわかりません。 なぜ3つ以上の参照変数が同じ文字列を参照する可能性があると スレッドセーフじゃないのか。 上記に提示していただいたソースが何をやっているかはわかりますが、 質問内容とどう関係してるのかよろしければ解説ねがいますか?