Семафоры
Классический механизм синхронизации в многопоточном программировании, который позволяет ограничивать доступ к общим ресурсам определенным количеством потоков. Семафоры поддерживают две основные операции: захват (acquire) и освобождение (release).
Семафоры могут использоваться для координации доступа к общим ресурсам, ограничения количества потоков, имеющих доступ к критическим секциям, и для решения проблемы "производительность-честность".
import java.util.concurrent.Semaphore
val semaphore = Semaphore(3) // Разрешаем одновременно не более 3 потоков
fun main() {
val threads = List(10) {
Thread {
semaphore.acquire()
println("Thread ${Thread.currentThread().name} acquired semaphore")
Thread.sleep(1000)
semaphore.release()
println("Thread ${Thread.currentThread().name} released semaphore")
}
}
threads.forEach { it.start() }
threads.forEach { it.join() }
}
import java.util.concurrent.Semaphore
val semaphore = Semaphore(0) // Изначально семафор заблокирован
fun main() {
val threads = List(3) {
Thread {
println("Thread ${Thread.currentThread().name} is waiting")
semaphore.acquire()
println("Thread ${Thread.currentThread().name} is released")
}
}
threads.forEach { it.start() }
Thread.sleep(3000) // Подождем немного
semaphore.release(3) // Разблокируем 3 потока
}