Java с нуля до middle
153 subscribers
56 photos
14 links
Download Telegram
Задача

Даны целые числа N и K, и последовательность из N целых чисел. Циклически сдвинуть все элементы последовательности на K элементов вправо.

Кто может решить?)
Многопоточка

Что делает этот код?
1. Создаем переменную counter, которую будем увеличивать
2. Создаем метод increment, в котором увеличиваем переменную на 1
3. Создаем класс R, который имплементирует Runnable и переопределяем метод run.
4. в методе run вызываем increment() 1000 раз
5.Создаем в main два потока и пихаем туда наш класс. Стартуем потоки через start() и просим их дождаться главного потока main, через join()
6. Выводим результат
Какой будет результат?
Anonymous Quiz
26%
2000
2%
1500
4%
0
68%
Всегда разный
Какой из потоков начнет работу первый? Они начнут работу в одно время? С одинаковой ли скоростью они работают?
Мы этого не знаем и гарантировать не можем.

Что выходит на практике, первый поток вызывает метод increment, и увеличивает count допустим до 200 сохраняя в память. Второй так же сразу начинает работу, но работает медленнее и за это же время увеличивает только до 100 и сохраняет в память, переписывая прошлое значение.

Первый поток что-то подвис, допустим ядро отвлеклось на другую задачу и до того, как он пробудится и начнет увеличивать снова, он берет число из память, а это число 100, а не 200. Вот тут и появляются проблема, называется она Data race.

Решить ее можно синхронизацией метода increment, написав public static synchronized void increment() . Это означает что дергать метод разные потоки будут строго по очереди.

Лучше переписать это через AtomicInteger. AtomicInteger имеет потокобезопасный метод getAndIncrement().
Но так никто не делает...

Хотите отслеживать состояние и более эффективно управлять потокам. Используйте ExecutorService.

На скрине переписал код
В этом коде создается объект ExecutorService с использованием метода newFixedThreadPool(2) из класса Executors. Это создает пул потоков с фиксированным размером 2, что означает, что может быть запущено не более 2 задач одновременно.

Далее в коде вызываются методы execute(new R()), которые отправляют задачи на выполнение в пул потоков. Задачи будут выполняться в одном из свободных потоков из пула.

Затем вызывается метод awaitTermination(1, TimeUnit.SECONDS), который блокирует выполнение потока, в котором он был вызван, до тех пор, пока все задачи из пула потоков не будут завершены или не истечет время 1 секунда.

Далее вызывается метод shutdownNow(), который прекращает прием новых задач и завершает текущие задачи как можно скорее.
Какой будет результат
Anonymous Quiz
23%
6000
23%
12000
53%
Всегда разный
https://www.youtube.com/watch?v=-e1_QhJ1EhQ

Это вам мотивация, почему надо быть связанным с технологиями, получать тех образование или просто постоянно быть в контексте происходящего!
👍3
Написал тут быструю приложуху как работает Hibernate
https://github.com/IvanKorni/hiber-h2

Есть worker у него только имя и фамилия, задача сохранить его в бд h2. Сделать это только с помощью Hibernate.

После сохранения вывести всех воркеров из бд.

Задание:
1. Сломать прогу, сделать так что бы был все время rollback при сохранении
2. Сделать логирование
3. Поднять кеш второго уровня
4. Достать одного воркера по фамилии
5. Задача посложнее: убрать из мейна все это, разнести все по слоям, сделать метод на сохранение и получение, написать тесты

Скидывайте код, я гляну
👍2
Всем привет, залил на гитхаб можете смотреть.
Т.к никто ничего не понял, буду делать голосование и объяснять темы подробнее, хибер и работа с бд это основа, должны понимать все.
👍2
Взял с hh.ru
Какое значение примет result?
Anonymous Quiz
14%
0
71%
2
16%
3
👍2
Задача с собеса

Дан циклический граф (линкед лист например, если проще) последний элемент которого ссылает на первый.

После выхода из метода, что с этими элементами сделает gabage collector?

Ответ в комментах
Новый день, новая задачка с собеса

Что если над бином повесить @Cacheable, и бин будет выполнять сложение двух чисел
1. всегда разных на входе
2. всегда одинаковых на входе

Какой мы будем получать результат?
В комменты
Вопрос hr до тех собеса

Бывает и так, что hr задает 5 вопросов по java, обычно они очень легкие

Если kafka пишет в три разных топика, можем ли прочитать записи по порядку?
Задача с leetcode

Перевернуть ListNode
Дано [1, 2, 3]
Получить [3, 2, 1]
🙉1
Задача с leetcode

Дан массив и число
Если сумма элементов двух чисел в массиве равно данному, вывести их порядок
Сорян во вторник в яндекс собес, пока тут будут задачки с литкод
🔥2