Вы можете включить журналы отладки SSL в конфигурации JVM сервера приложений, добавив следующий параметр командной строки JVM и перезапустив сервер приложений:
-Djavax.net.debug = all
В зависимости в вашей версии WAS добавление вышеуказанного параметра обычно выполняется путем перехода к консоли администратора WAS> Серверы> Серверы приложений> YourServer> Управление процессами> Виртуальная машина Java> Общие аргументы JVM
Разные архитектуры имеют разные правила, но в целом загрузка памяти и сохранение выровненных, int
-размерных объектов являются атомарными. Меньшие и большие могут быть проблематичными. Так что если sizeof (float) == sizeof (int)
, вы можете быть в безопасности, но я все равно не буду зависеть от него в переносимой программе.
Кроме того, поведение volatile
не очень хорошо определен ... В спецификации используется его как способ предотвратить оптимизацию доступа к вводу-выводу отображаемого в память устройства, но ничего не говорится о его поведении при любых других доступах к памяти.
Короче говоря. , даже если загрузка и сохранение являются атомарными на float x
, я бы использовал явные барьеры памяти (хотя их размер зависит от платформы и компилятора) вместо зависимости от volatile
.
Согласно разделу 24.4.7. 2 документации библиотеки GNU C:
На практике вы можете предположить, что
int
и другие целочисленные типы, длина которых не превышаетint
, являются атомарными. Вы также можете предположить, что типы указателей являются атомарными; это очень удобно. Оба эти предположения верны на всех машинах, которые поддерживает библиотека GNU C, и на всех известных нам системах POSIX.
float
технически не учитывается в соответствии с этими правилами, хотя если float
имеет тот же размер, что и int
в вашей архитектуре, вы можете сделать свою глобальную переменную int
, а затем преобразовывать ее в число с плавающей запятой с объединением каждый раз, когда вы прочтите или запишите его.
Самый безопасный способ действий - использовать какую-либо форму мьютекса для защиты доступа к общей переменной.
I would lock it down. I'm not sure how large float
is in your environment, but it might not be read/written in a single instruction so your reader could potentially read a half-written value. Remember that volatile
doesn't say anything about atomicity of operations, it simply states that the read will come from memory instead of being cached in a register or something like that.
Я считаю, что вам следует использовать мьютекс. Когда-нибудь ваш код может работать в системе, которая не имеет реального оборудования с плавающей запятой и вместо этого использует эмуляцию, что приводит к неатомарным переменным с плавающей запятой. Например, посмотрите -msoft-float здесь .
Мой ответ не был очень полезным. gcc -msoft-float
, возможно, является просто частным случаем, когда загрузка и хранение чисел с плавающей запятой не являются атомарными.
Присваивание не является атомарным, по крайней мере для некоторых компиляторов, и в том смысле, что для его выполнения требуется одна инструкция. Следующий код был сгенерирован Visual C ++ 6.0 - f1 и f2 относятся к типу float:
4: f2 = f1;
00401036 mov eax,dword ptr [ebp-4]
00401039 mov dword ptr [ebp-8],eax
Так как вы изменяете одно слово в памяти, вам должно быть хорошо с объявлением volatile.
Я не думаю, что вы гарантируете, что при прочтении у вас будет последнее значение, если только вы не используете блокировку.
По всей вероятности, нет. Поскольку у вас нет шансов на конфликт при записи, единственная проблема заключается в том, сможете ли вы прочитать его, пока он наполовину записан. Крайне маловероятно, что ваш код будет запускаться на платформе, где запись числа с плавающей запятой не происходит за одну операцию, если вы пишете что-то с потоками.
Однако это возможно , потому что определение числа с плавающей запятой в C не требует, чтобы базовая аппаратная память была ограничена размером слова процессора. Вы можете компилировать машинный код, где, скажем, Знак и мантисса записываются с помощью двух разных операций.
На самом деле, я думаю, два вопроса: «В чем обратная сторона наличия здесь мьютекса?» и «Каковы будут последствия, если я получу чтение мусора?»
Возможно, вместо мьютекса вам следует написать утверждение, которое определяет, меньше ли размер хранилища плавающего объекта или равен размеру слова базового процессора.