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