Ответ
Да, работал. Semaphore — это механизм синхронизации, который ограничивает количество потоков, одновременно получающих доступ к ресурсу. В Android его можно использовать через Semaphore из java.util.concurrent.
Пример:
val semaphore = Semaphore(3) // разрешает 3 потокам одновременно
fun accessResource() {
try {
semaphore.acquire() // блокирует, если лимит исчерпан
// работа с ресурсом
} finally {
semaphore.release() // освобождает слот
}
}
Используется, например, для ограничения параллельных сетевых запросов или доступа к файлам.
Ответ 18+ 🔞
А, ну вот, работал, блядь, с этой штукой! Semaphore — это такая хитрая жопа из мира многопоточности, которая следит, чтобы не слишком много потоков сразу лезло к одному ресурсу. В Android он живёт в java.util.concurrent, как и вся нормальная синхронизация.
Вот смотри, как это выглядит на практике:
val semaphore = Semaphore(3) // Разрешает только трём потокам одновременно, остальные — постой, паровоз
fun accessResource() {
try {
semaphore.acquire() // Тут поток пытается пролезть. Если мест нет — будет сидеть и ждать, как дурак
// А вот тут уже можно спокойно работать с ресурсом, не боясь, что на тебя навалятся все
} finally {
semaphore.release() // Обязательно отпускаем слот, а то другие так и будут ждать, доверия ебать ноль
}
}
Где это применить? Да везде, где нужно поставить заслонку! Например, у тебя есть API, который начинает икать, если больше трёх запросов одновременно слать. Или файл, в который писать больше чем из двух потоков — себе дороже. В общем, когда нужно сказать потокам: «Ребята, не толпитесь, ёпта, по одному заходите». Очень полезная штука, если, конечно, не забывать release() вызывать, а то потом сидишь и думаешь, почему всё зависло — а это ты сам всех заблокировал, мудя.