我现在正在编写 Java ME 应用程序。据我所知,它使用旧 Java内存模型,因为它的功能受限于Java 1.3。关于此模型提供的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()
从该字段读取。
声明两个字段volatile
是否足够?关于易失性读写重新排序,您能说些什么?我的代码是安全吗??
答案 0 :(得分:1)
不要依赖挥发性做任何事情。旧的记忆模型被打破了,这就是为什么有一个新的。
使用对象同步对字段的访问。这是保证写/读安全的唯一方法。 (即Object obj = new Object();并且在每个方法中: synchronized(obj){})