编程语言
首页 > 编程语言> > java – 声明两个字段是否足够?

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