声明两个字段是否足够挥发?

时间:2012-09-14 16:47:18

标签: java java-me concurrency volatile java-memory-model

我现在正在编写 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 是否足够?关于易失性读写重新排序,您能说些什么?我的代码是安全吗?

1 个答案:

答案 0 :(得分:1)

不要依赖挥发性做任何事情。旧的记忆模型被打破了,这就是为什么有一个新的。

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

相关问题