В Java есть несколько методов, позволяющих синхронизировать выполнение потоков:
- synchronized блок - позволяет выполнить блок кода только одному потоку в момент времени:
- Синхронизация метода:
public synchronized void myMethod() {
// код метода, который должен быть выполнен только одним потоком одновременно }
- Синхронизация блока:
synchronized(myObject) {
// код блока, который должен быть выполнен только одним потоком одновременно }
- wait() и notify() методы - позволяют потокам координировать свою работу, чтобы избежать состояния гонки и других проблем с синхронизацией. Метод wait() вызывается на объекте, в который блокирующий поток хочет войти, а метод notify() вызывается на том же объекте, когда блокирующий поток должен быть разблокирован и продолжить свою работу.
- Метод wait() вызывается потоком, который ждет выполнения определенного условия. Он освобождает монитор объекта, который вызвал его, и приостанавливает выполнение потока, пока другой поток не вызовет метод notify() или notifyAll().
- Метод notify() вызывается потоком, который изменяет состояние объекта и оповещает другие потоки, которые вызвали метод wait(). Он будит только один из ожидающих потоков.
- Метод notifyAll() вызывается потоком, который изменяет состояние объекта и оповещает все ожидающие потоки.
- ReentrantLock - позволяет потокам получать эксклюзивный доступ к критическим секциям кода, а также обеспечивает более гибкий и функциональный подход к синхронизации потоков. Включает методы lock() и unlock() для блокировки и разблокировки выполнения потоков.
1606 вопрос-ответ по Java: https://github.com/DEBAGanov/interview_questions
Tелеграмм канал: https://t.me/DEBAGanov
Мое резюме: https://github.com/DEBAGanov