Have a range of 1000-01-01 00:00:00 to 9999-12-31 23:59:59
Values outside the range may work - but only values within the range are guaranteed to work.
https://mariadb.com/kb/en/constraint/Потоки потребляют память; у каждого потока есть собственный стек
для локальных переменных, а переключение между работающими потоками
(переключение контекста) создает дополнительную нагрузку на процессор.
Хотя потоки относительно легковесны (теоретически на большом сервере мо�гут работать сотни и тысячи потоков), но все-таки в какой-то момент времени
ресурсы, потребляемые потоками, могут вступить в противоречие с той целью,
ради которой запущено так много потоков. Часто это противоречие возникает
всего с несколькими десятками потоков. А решение с созданием отдельного
потока для каждого клиента не всегда масштабируется.
В таких ситуациях часто создаются «пулы потоков»: фиксированный набор
потоков извлекает задачи из очереди и возвращается за новыми задачами
после их завершения. Такое повторное использование потоков обеспечивает стабильную масштабируемость, но раньше его было трудно эффективно реализовать на Java-серверах, потому что потоковый ввод-вывод (для таких
источников, как сокеты) не в полной мере поддерживал неблокирующие
операции. NIO поддерживает асинхронные каналы: неблокирующие
операции чтения и записи, а также возможность проверки готовности потоков
к перемещению данных. Каналы также могут асинхронно закрываться, что
позволяет потокам корректно работать с ними.
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.htmlThread pools address two different problems: they usually provide improved performance when executing large numbers of asynchronous tasks, due to reduced per-task invocation overhead, and they provide a means of bounding and managing the resources, including threads, consumed when executing a collection of tasks. Each ThreadPoolExecutor also maintains some basic statistics, such as the number of completed tasks.
Какие важные средства многопоточности и станадртных реализаций паттернов можно выделить:
Реализации коллекций с поддержкой потоков в concurrent:
-Queue с ограниченным по времени ожиданием и блокировкой, неблокирующие, оптимизированные для параллельного доступа реализации интерфейсов Queue, Map.
-List, Set "copy on write" - эффективны с доступом "почти всегда для чтения" (>>48235).
Executor, future, callable:
-Запускает задачи (включая объекты Runnable).
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html-Future,callable
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.htmlhttps://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.htmlA Future represents the result of an asynchronous computation. Methods are provided to check if the computation is complete, to wait for its completion, and to retrieve the result of the computation. The result can only be retrieved using method get when the computation has completed, blocking if necessary until it is ready.
java.util.concurrent.locks:
-lock
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Lock.html-condition
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.htmlCondition factors out the Object monitor methods (wait, notify and notifyAll) into distinct objects to give the effect of having multiple wait-sets per object, by combining them with the use of arbitrary Lock implementations. Where a Lock replaces the use of synchronized methods and statements, a Condition replaces the use of the Object monitor methods.
Высокоуровневые конструкции (классы, реализущие паттерны синхронизации):
CyclicBarrier, CountDownLatch, Semaphore
и Exchanger. (примеры на пикр4)
Атомики:
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.htmlhttps://youtu.be/tAbe5m7RjWE