Middle+
¿Cómo hacer que un método sea seguro para hilos, de modo que no pueda ser llamado desde otro hilo mientras se está ejecutando en un hilo?
sobes.tech AI
Respuesta de la IA
Используйте ключевое слово synchronized для метода.
class SafeCounter {
private int count = 0;
public synchronized void increment() {
// Этот блок кода будет выполняться только одним потоком одновременно
count++;
}
public synchronized int getCount() {
return count;
}
}
Также можно использовать synchronized блок с монитором объекта.
class AlternativeSafeCounter {
private int count = 0;
private final Object counterLock = new Object(); // Создаем объект-монитор
public void increment() {
synchronized (counterLock) { // Синхронизация по объекту counterLock
count++;
}
}
public int getCount() {
synchronized (counterLock) { // Синхронизация по объекту counterLock
return count;
}
}
}
Другие механизмы для более сложной синхронизации:
ReentrantLock: Более гибкая альтернативаsynchronizedс возможностью получения информации о блокировке и управлением таймаутами.Semaphore: Ограничивает количество потоков, которые могут одновременно получить доступ к ресурсу.Atomicклассы (например,AtomicInteger): Предоставляют атомарные операции над примитивными типами без явной блокировки.
Пример с AtomicInteger:
import java.util.concurrent.atomic.AtomicInteger;
class AtomicCounter {
private final AtomicInteger count = new AtomicInteger(0);
public void increment() {
count.incrementAndGet(); // Атомарная операция инкремента
}
public int getCount() {
return count.get();
}
}