В Java существует несколько способов синхронизации, которые позволяют управлять доступом к общим ресурсам. Ниже перечислены некоторые из них:
Ключевое слово synchronized: Ключевое слово synchronized может быть использовано для синхронизации методов или блоков кода. Когда метод или блок кода помечены как synchronized, только один поток может выполнить их в определенный момент времени. Это гарантирует, что общие ресурсы будут использоваться безопасно. Пример использования ключевого слова synchronized:
public synchronized void synchronizedMethod() {
// Код, требующий синхронизации }
- Объекты Lock: Интерфейс Lock предоставляет более гибкий механизм синхронизации, чем ключевое слово synchronized. Он позволяет явно захватывать и освобождать блокировку. Пример использования объекта Lock:
Lock lock = new ReentrantLock();
public void synchronizedMethod() {
lock.lock();
try {
// Код, требующий синхронизации
} finally {
lock.unlock();
}
}
- Объекты Condition: Интерфейс Condition используется совместно с объектами Lock для реализации условной синхронизации. Он позволяет потокам ожидать определенного условия и уведомлять другие потоки о его изменении. Пример использования объекта Condition:
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void awaitCondition() throws InterruptedException {
lock.lock();
try {
while (!conditionMet) {
condition.await();
}
// Код, выполняемый после выполнения условия
} finally {
lock.unlock();
}
}
public void signalCondition() {
lock.lock();
try {
conditionMet = true;
condition.signalAll();
} finally {
lock.unlock();
}
}
- volatile переменные: Ключевое слово volatile используется для обозначения переменных, которые могут быть изменены несколькими потоками. Оно гарантирует, что изменения переменной будут видны всем потокам. Однако volatile не обеспечивает атомарность операций. Пример использования volatile переменной:
private volatile boolean flag = false;
public void setFlag(boolean value) {
flag = value;
}
public boolean getFlag() {
return flag;
}
Если вам понравилось, буду признателен за подписку.