volatile:
volatile
- это ключевое слово. volatile
заставляет все потоки получать последнее значение переменной из основной памяти вместо кеша. Для доступа к изменчивым переменным не требуется блокировка.
Использование переменных volatile
снижает риск ошибок согласованности памяти, поскольку любая запись в изменчивую переменную устанавливает связь между событиями и последующими чтениями того же самого переменная.
Это означает, что изменения в переменной volatile
всегда видны для других потоков . Более того, это также означает, что , когда поток читает переменную volatile
, он видит не только последнее изменение волатильности, но также и побочные эффекты кода, которые привели к изменению .
Когда использовать: Один поток изменяет данные, а другие потоки должны считывать последнее значение данных. Другие потоки предпримут какое-то действие, но они не будут обновлять данные .
AtomicXXX:
AtomicXXX
классы поддерживают блокировку - безопасное программирование на отдельные переменные. Эти классы AtomicXXX
(например, AtomicInteger
) устраняют ошибки несогласованности памяти / побочные эффекты модификации изменчивых переменных, к которым обращаются в нескольких потоках.
Когда использовать: несколько потоков могут считывать и изменять данные.
синхронизировано:
synchronized
- ключевое слово, используемое для защиты метода или кода. С помощью синхронного метода имеет два эффекта:
synchronized
на одном и том же объекте чередовали. Когда один поток выполняет метод synchronized
для объекта, все другие потоки, которые вызывают методы synchronized
для одного и того же объекта (приостановить выполнение) до тех пор, пока первый поток не будет выполнен с объектом. synchronized
завершает работу, он автоматически устанавливает связь между событиями и последующим вызовом метода synchronized
для одного и того же объекта. Это гарантирует, что изменения состояния объекта видны для всех потоков. Когда использовать: Несколько потоков могут считывать и изменять данные. Ваша бизнес-логика не только обновляет данные, но также выполняет атомные операции
AtomicXXX
эквивалентна volatile + synchronized
, хотя реализация отличается. AmtomicXXX
расширяет volatile
переменные + compareAndSet
, но не использует синхронизацию.
Связанные вопросы SE:
Разница между летучей и синхронизированной в Java
Летучие булевы против AtomicBoolean
Хорошие статьи для чтения: (Над содержимым взяты с этих страниц документации)
https://docs.oracle.com/javase/tutorial/essential/concurrency/ sync.html
https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html
CASE WHEN a.fieldname IS NULL
THEN 0
ELSE a.fieldname
END AS fieldname
использовать ISNULL (поле, 0), это будет вставлять ноль, если поле NULL
что-то вроде: -
SELECT * FROM
(SELECT ifnull(uID,0) as uID from Class) T1
LEFT OUTER JOIN
(SELECT ifnull(pID,0) as pID from University) T2
ON T1.uID = T2.pID