Достаточно ли объявления двух полей изменчивыми?

Сейчас я пишу приложение 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 достаточно? Что вы можете сказать о изменчивом переупорядочении операций чтения и записи? Является ли мой код безопасным?


person Community    schedule 14.09.2012    source источник
comment
Это кажется действительно плохим планом, если я делаю вывод о том, что вы пытаетесь сделать.   -  person Stephen Connolly    schedule 14.09.2012


Ответы (1)


Не полагайтесь на то, что volatile ничего не делает. Старая модель памяти была сломана, поэтому и появилась новая.

Синхронизируйте доступ к своим полям с объектом. Только так вы можете гарантировать безопасность записи/чтения. (т.е. Object obj = new Object(); и в каждом методе: synchronized (obj) {} )

person edharned    schedule 14.09.2012
comment
Почему создание объекта не защищено ключевым словом synchronized? - person ; 14.09.2012
comment
Эта страница отвечает на вопрос: securecoding.cert.org/confluence/ страницы/ - person edharned; 15.09.2012