РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1063 of 1361 menu

Класс Lock

Класс Lock представляет собой блокировку ресурса и позволяет организовать безопасную работу с общими данными в условиях конкурентного доступа. Экземпляр класса создаётся через LockFactory или через сервис lock.factory. Класс предоставляет методы acquire, release, isAcquired и refresh, которые управляют жизненным циклом блокировки. Первым параметром в методы acquire и refresh передаётся флаг блокировки: false для неблокирующего режима или true для ожидания освобождения ресурса.

Синтаксис

$lock->acquire(blocking: false); $lock->release(); $lock->isAcquired(); $lock->refresh(blocking: false);

Пример

Давайте создадим блокировку через LockFactory и захватим ресурс:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Lock\LockFactory; use Symfony\Component\Lock\Store\InMemoryStore; use Symfony\Component\Routing\Attribute\Route; class LockController extends AbstractController { #[Route('/lock', name: 'lock_index')] public function index(): Response { $store = new InMemoryStore(); $factory = new LockFactory($store); $lock = $factory->createLock('resource'); if ($lock->acquire()) { $res = 'lock acquired'; $lock->release(); } else { $res = 'lock busy'; } return new Response($res); } } ?>

Результат выполнения кода:

"lock acquired"

Пример

Давайте проверим состояние блокировки через isAcquired после захвата:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Lock\LockFactory; use Symfony\Component\Lock\Store\InMemoryStore; use Symfony\Component\Routing\Attribute\Route; class LockController extends AbstractController { #[Route('/lock/state', name: 'lock_state')] public function state(): Response { $store = new InMemoryStore(); $factory = new LockFactory($store); $lock = $factory->createLock('resource'); $lock->acquire(); $res = $lock->isAcquired() ? 'acquired' : 'released'; $lock->release(); return new Response($res); } } ?>

Результат выполнения кода:

"acquired"

Пример

Давайте обновим время жизни блокировки через refresh, чтобы продлить её действие:

<?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Lock\LockFactory; use Symfony\Component\Lock\Store\InMemoryStore; use Symfony\Component\Routing\Attribute\Route; class LockController extends AbstractController { #[Route('/lock/refresh', name: 'lock_refresh')] public function refresh(): Response { $store = new InMemoryStore(); $factory = new LockFactory($store); $lock = $factory->createLock('resource', ttl: 1.0); $lock->acquire(); sleep(1); $refreshed = $lock->refresh(); $res = $refreshed ? 'refreshed' : 'expired'; $lock->release(); return new Response($res); } } ?>

Результат выполнения кода:

"refreshed"

Смотрите также

  • класс LockFactory,
    который создаёт экземпляры блокировок
  • метод acquire,
    который захватывает блокировку ресурса
  • метод release,
    который освобождает захваченную блокировку
  • метод isAcquired,
    который проверяет состояние блокировки
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить