現在、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()
書き込み、メソッドはそのフィールドから読み取ります。volatile
cancelBillRequest()
2 つのフィールドを宣言するだけでvolatile
十分ですか? 揮発性の読み取りと書き込みの並べ替えについてどう思いますか? 私のコードは安全ですか?