パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

小田急予約サイトで競合状態バグによるトラブル」記事へのコメント

  • request/session/applicationの正しい認識が重要かと。(j2eeの場合)
    あとはstaticの認識と。
    • staticの認識を言うならば、synchronizedとvolatile、sleep()・wait()・notify()・notifyAll()の正しい認識も同時に必要でしょう。
      staticを使ってのパフォーマンス向上は諸刃の剣のはずなのだけど…やたらとpubli staticなsetter/getterを作りたがるPGがたまに居て…_no
      • 突っ込みどころは色々あるが、static な getter/setter は bean ならあり得ないんじゃ…。
        staticメソッドから非staticな変数へはアクセス出来ないし。
        • いや、まじめに

          public class Configuration {
              private static String s1;

              public static void setS1(String s){
                  s1 = s;
              }

              public static String getS1(){
                  return s1;
              }
          }

          こんなの書いてきた人います。しかも複数…。
          • ぱっと、思い付いたので。

            『newしないとクラスが使えないようだが?』
            『staticなんて飾りです。偉い人にはそれが分からんのです』

            まあ、Math classみたいにそれ自体にデータを持たない場合の
            static methodはありだし、システム全体の排他制御
            • > なんにしろ、設計に存在しないグローバル変数はバグの元。

              そういうグローバル変数に触れていないメソッドであることを、
              コンパイラにも分かる形で宣言できたらいいのに、と思ったことがあります。

              例えば、java.lang.Integer の parseInt(String) なんかは、入力された引数のみ が
              戻り値に影響を与えるべきメソッドですが、本当に大丈夫か、と疑い出したら、
              ソースを追ってみるしかないです。
              • スレッドセーフであるかは JavaDocで表明します [sun.com]。

                >別なスレッドの影響を受けちゃうような実装に*なっていない*ことを、
                >表明できる仕組みがあればいいのになぁ
                コンパイラに対してってのは難しいですねぇ。
                コンパイラに宣言する以上はコンパイラは実装をチェックする
                必要がありますが、そのメソッドから呼び出される処理は全部
                再帰的にチェックしなくてはいけません。
                流石にコンパイラの手に負えないですね。クラスファイルの
                形式にも変更が必要になります。
                変に採用すると
                「ちゃんとスレッドセーフだけど、コンパイラが文句を言うので表明できない」
                なんてケースが出てきそうです。
              • 今ならスレッドセーフかどうかを宣言するにはアノテーションを使えばええんではないですか。
              • あ、クラスファイルに印を付けるだけならアノテーションでもいけますね。
                ただ、アノテーションは「スレッドセーフをコンパイラに対して表明する」ではなく、「ツールや
                他の開発者にそう主張している」ですから、JavaDocでの表明と本質的な違いがないです。

                ・他の開発者に伝えるのなら、JavaDocで表明する
                 (フォーマットを統一したりしたいなら-tagオプションやTaglet、Doclet)
                ・コンパイラやツールがスレッドセーフの保障をするのは無理
                ・作成者の表明(JavaDocやアノテーション)を疑うならソースを追うしかない
                が本題です。
                親コメント

「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」

処理中...