java – 声明两个字段是否足够?
作者:互联网
我现在正在编写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()从那些字段读取.
声明两个字段是否足够挥发?您对易失性读写重新排序有什么看法?我的代码安全吗?
解决方法:
不要依赖挥发性做任何事情.旧的内存模型被打破了,这就是为什么有一个新的内存模型.
使用对象同步对字段的访问.这是保证写/读安全的唯一方法. (即Object obj = new Object();并且在每个方法中:
synchronized(obj){})
标签:java,concurrency,volatile,java-me,java-memory-model 来源: https://codeday.me/bug/20190709/1413725.html