同步锁
优质
小牛编辑
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();
}