4

我现在正在编写一个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读写重新排序有什么看法?我的代码安全吗?

4

1 回答 1

1

不要依赖 volatile 做任何事情。旧的内存模型被打破了,这就是为什么有一个新的。

使用对象同步对字段的访问。这是保证写/读安全的唯一方法。(即 Object obj = new Object(); 并在每个方法中: synchronized (obj) {} )

于 2012-09-14T18:08:38.720 回答