4

現在、Java MEアプリケーションを作成しています。私が知っているように、その機能は Java 1.3 に制限されているため、古いJava メモリ モデルを使用しています。このモデルが提供する volatile キーワードに関する唯一の保証は、すべての読み取りと書き込みがメイン メモリを直接経由し、キャッシュされないことです。

次のコードを検討してください。

class BillHelper {
    volatile HttpConnection con;
    volatile InputStream in;

    // Called from thread A
    BillResponse makeBill(BillRequest request) throws BillException {
        // open http connection
        // extract request data from method parameter
        // prepare all needed headers
        // flush headers
        // open input stream, parse response
    }

    // Called from thread B
    void cancelBillRequest() {
        if (in != null) {            
            try {
               in.close();
            } catch (IOException ignored) {}
        }

        if (con != null) {  
            try {
               con.close();
            } catch (IOException ignored) {}
        }
    }
}

メソッドは異なるスレッドから呼び出されます。メソッドは変数にmakeBill()書き込み、メソッドはそのフィールドから読み取ります。volatilecancelBillRequest()

2 つのフィールドを宣言するだけでvolatile 十分ですか? 揮発性の読み取りと書き込みの並べ替えについてどう思いますか? 私のコードは安全ですか?

4

1 に答える 1

1

揮発性のものに依存しないでください。古いメモリモデルが壊れていたため、新しいモデルがあります。

フィールドへのアクセスをオブジェクトと同期します。これが、書き込み/読み取りの安全性を保証できる唯一の方法です。(つまり、Object obj = new Object();および各メソッドで:synchronized(obj){})

于 2012-09-14T18:08:38.720 に答える