同步锁

优质
小牛编辑
137浏览
2023-12-01

同步(Synchronize)操作是web编程中不可以避免的, 在java中, 我们通过同步代码块,同步方法,同步对象锁等等各种办法去实现,而且这些 方法都是java内置实现的我们直接使用就行。但是php中我们需要自己去实现。 Herosphp框架提供了2种实现同步操作的方法,供你在高并发中实现逻辑的有序操作。

FileSynLock

FileSynLock 是基于系统的文件锁实现,它的特点是兼容windows, linux, mac 操作系统。缺点是相对来说效率不是很高。

SemSynLock

SemSynLock 只支持linux系统,因为它是通过系统信号量加锁方式实现, windows 系统不支持。

同步锁的使用

我们提供了一个同步锁的工厂类 SynLockFactory 通过工厂类去获取同步锁. 获取同步锁需要为该锁分配一个唯一ID(key)

SynLockFactory::getFileSynLock($key) 获取文件同步锁

SynLockFactory::getSemSynLock($key) 获取信号量锁

所有的同步锁都继承了同步锁接口 ISynLock. 可使用的接口如下:

ISynLock::tryLock(); 尝试去获取锁,成功返回false并且一直阻塞。如果获取锁失败会抛出异常

ISynLock::unlock(); 尝试去释放锁,释放失败则会抛出异常

使用Demo

举一个简单的使用场景,我们在开发金融平台的时候,为了避免多个线程同时操作同一个用户的资金,就是使用同步锁实现的。

$userid = $request->getParamter('uid');
$lock = SynLockFactory::getFileSynLock($userid);
if ( $lock->tryLock ) {
    //做一些用户资金操作
    ...
    $lock->unlock();
}