我现在正在编写一个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
是否足够?关于volatile读写重新排序,您能说些什么?我的代码安全吗?
不要依赖volatile做任何事情。旧的记忆模式被打破了,这就是为什么有了新的记忆模式。
将对字段的访问与对象同步。这是保证写/读安全的唯一方法。(即Object obj=new Object();并且在每种方法中:同步(obj){})